将TextBox.Text绑定到DataSet.DataSetName

时间:2018-08-15 20:06:42

标签: c# .net winforms data-binding dataset

我正在尝试将TextBox的{​​{1}}属性绑定到Text的{​​{1}}属性。

我知道

  

System.ArgumentException:'无法绑定到数据源上的属性或列DataSetName。   参数名称:dataMember'

是否可以通过这种方式绑定单个文本框?我认为这与DataSet是一个集合有关,因此DataSetName期望有一个与其绑定的表,而不是一个文本框。

是否可以在不创建用于容纳我的DataSet属性和BindingSource的“容器”类的情况下实现这一目标?

修改

不包含任何代码对我来说很愚蠢。所以你去了:

DataSetName
  • DataSet是正确的(不是null,指向this.tableGroupBindingSource.DataSource = typeof(DataSet); ... this.TableGroupNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.tableGroupBindingSource, "DataSetName", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); ... tableGroupBindingSource.DataSource = node.TableGroup; 右上方的点)

一旦文本框被实际绘制,我就会收到上述异常。

我在设计器中使用winforms,因此自动生成了前两行代码。

1 个答案:

答案 0 :(得分:0)

CurrencyManager使用ListBindingHelper.GetListItemProperties(yourDataset)来获取其属性,并且由于其类型描述符而没有返回任何属性,因此数据绑定失败。

通过使用围绕数据集的包装器,实现自定义类型描述符以提供数据集属性,可以以不同的方式公开DataSet属性:

using System;
using System.ComponentModel;
public class CustomObjectWrapper : CustomTypeDescriptor
{
    public object WrappedObject { get; private set; }
    public CustomObjectWrapper(object o) : base()
    {
        WrappedObject = o ?? throw new ArgumentNullException(nameof(o));
    }
    public override PropertyDescriptorCollection GetProperties()
    {
        return this.GetProperties(new Attribute[] { });
    }
    public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        return TypeDescriptor.GetProperties(WrappedObject, true);
    }
    public override object GetPropertyOwner(PropertyDescriptor pd)
    {
        return WrappedObject;
    }
}

然后以这种方式使用它:

var myDataSet = new DataSet("myDataSet");
var wrapper = new CustomObjectWrapper(myDataSet);
textBox1.DataBindings.Add("Text", wrapper, "DataSetName", true, 
    DataSourceUpdateMode.OnPropertyChanged);