我通常用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, "???");
我错过了一些非常明显的东西吗?我希望如此!
答案 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");