将DataSource与TextBox一起使用

时间:2009-09-05 15:33:46

标签: c# textbox datasource

我通常用C ++编程,所以所有这些DataSource / DataSet / Binding的东西都让我感到困惑。希望你们能帮忙。

基本上我正在编写基于XML的文件格式的编辑器(特别是OFX,用于财务数据)。我在我的架构上使用了xsd.exe来将加载的文件反序列化为漂亮的普通旧类。我发现DataGridView很棒,我可以将其DataSource属性设置为我感兴趣的集合之一(特别是事务列表),当我查看这些值时,这些更改会反映在加载中反序列化文件,然后我可以在保存时序列化。但是当我想将一个简单的字符串'映射'到TextBox(例如帐号)时,我无法在TextBox上使用这个聪明的方法,似乎没有DataSource成员...使用他们的'Text'属性只设置一次文本并且不会将更改反映回底层对象,因此保存必须首先从控件中获取值。我希望它像DataGridView一样自动化。

我试过摆弄DataBindings,但我不知道要用什么作为propertyName或dataMember,所以我不确定这是不是我的意思:

accountNumberTextBox.DataBindings.Add(new Binding("???", myDocument.accountNumber, "???");

我错过了一些非常明显的东西吗?我希望如此!

2 个答案:

答案 0 :(得分:4)

您缺少的是string在.NET中是不可变的。因此,对于任何意义上的绑定,string值需要由其他东西封装。然后,当用户输入值时,数据绑定系统用新的字符串替换现有字符串。

封装string的其他内容可以是DataTable或包含更改通知的普通旧类。提供此更改通知的最佳方法是实现INotifyPropertyChanged接口。

例如:

public class Document : INotifyPropertyChanged
{
    private string _accountNumber;

    public string AccountNumber
    {
        get { return _accountNumber; }
        set
        {
            if (_accountNumber != value)
            {
                _accountNumber = value;
                //this tells the data binding system that the value has changed, so the interface should be updated
                OnPropertyChanged("AccountNumber");
            }
        }
    }

    //raised whenever a property value on this object changes. The data binding system attaches to this event
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged:

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

因此,您的数据绑定连接将如下所示:

var document = ...; //get document from somewhere
//bind the Text property on the TextBox to the AccountNumber property on the Document
textBox1.DataBindings.Add("Text", document, "AccountNumber");

答案 1 :(得分:2)

accountNumberTextBox.DataBindings.Add("Text",
                                      myDocumnt.Tables["your_table"],
                                      "table_field");

实施例,

DataSet ds = new DataSet("DB");
DataTable dt = new DataTable("myTable");
dt.Columns.Add("Name");
dt.Rows.Add("PP");
dt.Rows.Add("QQ");
ds.Tables.Add(dt);

textBox1.DataBindings.Add("Text", ds.Tables["myTable"], "Name");