【发布时间】:2010-03-12 16:58:10
【问题描述】:
这对我来说确实是一个错误,但也许一些数据绑定专家可以启发我? (我的 WinForms 数据绑定知识非常有限。)
我有一个ComboBox 绑定到一个已排序的DataView。当DataView 中项目的属性发生更改以使项目被重新使用时,我的ComboBox 中的SelectedItem 不会保持同步。它似乎指向某个完全随机的地方。这是一个错误,还是我在数据绑定中遗漏了什么?
这是一个重现问题的示例应用程序。您只需要一个Button 和一个ComboBox:
public partial class Form1 : Form
{
private DataTable myData;
public Form1()
{
this.InitializeComponent();
this.myData = new DataTable();
this.myData.Columns.Add("ID", typeof(int));
this.myData.Columns.Add("Name", typeof(string));
this.myData.Columns.Add("LastModified", typeof(DateTime));
this.myData.Rows.Add(1, "first", DateTime.Now.AddMinutes(-2));
this.myData.Rows.Add(2, "second", DateTime.Now.AddMinutes(-1));
this.myData.Rows.Add(3, "third", DateTime.Now);
this.myData.DefaultView.Sort = "LastModified DESC";
this.comboBox1.DataSource = this.myData.DefaultView;
this.comboBox1.ValueMember = "ID";
this.comboBox1.DisplayMember = "Name";
}
private void saveStuffButton_Click(object sender, EventArgs e)
{
DataRowView preUpdateSelectedItem = (DataRowView)this.comboBox1.SelectedItem;
// OUTPUT: SelectedIndex = 0; SelectedItem.Name = third
Debug.WriteLine(string.Format("SelectedIndex = {0:N0}; SelectedItem.Name = {1}", this.comboBox1.SelectedIndex, preUpdateSelectedItem["Name"]));
this.myData.Rows[0]["LastModified"] = DateTime.Now;
DataRowView postUpdateSelectedItem = (DataRowView)this.comboBox1.SelectedItem;
// OUTPUT: SelectedIndex = 2; SelectedItem.Name = second
Debug.WriteLine(string.Format("SelectedIndex = {0:N0}; SelectedItem.Name = {1}", this.comboBox1.SelectedIndex, postUpdateSelectedItem["Name"]));
// FAIL!
Debug.Assert(object.ReferenceEquals(preUpdateSelectedItem, postUpdateSelectedItem));
}
}
澄清一下:
- 我知道我将如何修复上面的简单应用程序——我只是将其包括在内以演示问题。我关心的是,当底层数据行的更新可能发生在任何地方(可能是在另一种形式上)时,如何解决它。
- 我真的很想接收对我的数据源的更新、插入、删除等。我尝试只绑定到与
DataTable分离的DataRows数组,但这会引起额外的麻烦。
【问题讨论】:
标签: winforms data-binding combobox