1

我收到“无法绑定到数据源上的属性或列”的代码(在附加了“ <-- here! ”注释的行上):

List<QHQuad> listQH = PlatypusData.GetQHForPlatypusAndDay(platypusId, dow);
foreach (var quad in listQH)
{
    int QHCell = quad.QH;
    if ((QHCell >= 1) || (QHCell <= QUARTER_HOUR_COUNT))
    {
        string PH1CellToPopulate = string.Format("textBoxA_{0}", QHCell);
        string PH2CellToPopulate = string.Format("textBoxB_{0}", QHCell);
        string PH3CellToPopulate = string.Format("textBoxC_{0}", QHCell);
        var tb = (TextBox)this.Controls.Find(PH1CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph1")); // <-- here!
        tb = (TextBox)this.Controls.Find(PH2CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph2"));
        tb = (TextBox)this.Controls.Find(PH3CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph3")); 
    }
}

在故障点,quad 包含四个值: QHCell,即 1;Ph1,为空字符串;Ph2,为空字符串;和Ph3,即“1”

更新

我不认为可见性是个问题,因为我可以访问 quad.QH;此外,该课程是公开的。

我得到的更完整的异常是“ System.ArgumentException is unhandled by user code Message=Cannot bind to the property or column Ph1 on the DataSource. Parameter name: dataMember

如果我更改问题行:

tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));

...对此:

tb.DataBindings.Add(new Binding("Text", listQH, "quad.Ph1"));

我得到,“无法创建字段四边形的子列表

更新 2

我认为这是因为我这样做的方式,绑定数据是没有意义的:

最初我有一个有 384 名成员的班级,96 个这种“四边形”:

int
string
string
string

然后我将其更改为使用具有 4 个成员的类的 96 个实例(上面的那些 - “四元组”,即 QH、Ph1、Ph2 和 Ph3)。

因此,尝试绑定到这些瞬态类实例对我来说并不明智——我必须保留该类的 96 个实例。

我仍然可能是错的,但这就是我认为这里数据绑定失败的原因:我将我的代码优雅化为遗忘。

4

3 回答 3

6

根据您对 sharp_net 的评论,数据绑定适用于属性,而不是字段。

从此更改您的课程:

public class QHQuad {
  public int QH;
  public string Ph1;
  public string Ph2;
  public string Ph3;
}

对此:

public class QHQuad {
  public int QH {get; set;}
  public string Ph1 {get; set;}
  public string Ph2 {get; set;}
  public string Ph3 {get; set;}
}

您还应该考虑实现INotifyPropertyChanged接口。

于 2012-08-20T23:02:35.073 回答
2

当我拼错列名时,我可以重现错误“ex.Message =”无法绑定到数据源上的属性或列 numpmt。\r\n参数名称:dataMember”。

请验证您的列名是否正确。

于 2012-08-20T22:30:45.103 回答
1

我收到此错误“无法绑定到数据源上的属性或列。参数名称:dataMember。” -- 但仅在以发布模式运行时。

可以在此处查找引发此错误的参考源: http ://referencesource.microsoft.com/#System.Windows.Forms/ndp/fx/src/winforms/Managed/System/WinForms/BindToObject.cs.html ,它发生在 CheckBinding() 中。

当数据源实际上为空时,我得到了错误,仅在发布模式下。绑定源已经在设计器中创建,所以 MyForm.Designer.cs 某处说

this.myBindingSource.DataSource = typeof(MyClass);

和 MyForm.cs 某处说

this.myBindingSource.DataSource = null;

同样,该错误仅在发布模式下发生,并且它不会停止能够继续的应用程序,除非用户在错误对话框中单击“退出”。

于 2014-07-11T07:18:24.310 回答