为什么我的绑定失败了?

时间:2012-08-20 20:58:00

标签: c# winforms data-binding dynamic

我使用此代码获取“无法绑定到数据源上的属性或列”(在包含“< - 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未被用户代码处理Message =无法绑定到DataSource上的属性或列Ph1。 参数名称:dataMember

如果我更改问题行:

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

......对此:

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

我知道,“无法创建字段quad的子列表

更新2

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

最初我有一个有384名成员的班级,这类96“四分之一”:

int
string
string
string

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

因此,尝试绑定到这些瞬态类实例对我来说并不是真的合理 - 我必须保留该类的96个实例。

我仍然可能是错的,但我认为这就是数据绑定失败的原因:我将我的代码置于遗忘之中。

3 个答案:

答案 0 :(得分: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界面。

答案 1 :(得分:2)

我可以重现错误“ex.Message =”无法绑定到DataSource上的属性或列numpmt。\ r \ nParameter name:dataMember“当我拼错列名时。

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

答案 2 :(得分:1)

我收到此错误“无法绑定到DataSource上的属性或列。 参数名称: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;

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