C#ResetBinding翻转DataGridView 已更新为示例
时间:2020-03-06 14:53:19 来源:igfitidea点击:
我有一个已部分解决的问题。快速解释一下:我有一个绑定到需要序列化的复杂对象的网格。从序列化构建对象时,网格上的事件不会刷新表显示。有人告诉我一旦取消序列化即可重建活动,它可以正常工作!但是刷新网格的事件似乎根本没有触发。
我必须从我的复杂对象构建一个事件,该事件告诉我内部发生了一些变化。从此事件中,我添加了以下代码:
this.bindingSource1.ResetBindings(false);
问题在于网格正在翻转并且用户感觉不佳(行在上下移动,而不是停下来)。
如何在没有这种翻转的情况下重置绑定?
我该如何解决原来的问题? (这将自动解决所有问题)。
更新
这是一个执行完全相同的行为的示例:
创建一个类:
[Serializable()] class BOClient : INotifyPropertyChanged, IDataErrorInfo { private string name; private int len; public string Name { get { return name; } set { name = value; this.len = name.Length; if (this.PropertyChanged !=null) this.PropertyChanged(this, new PropertyChangedEventArgs("Name")); } } public int Len { get { return this.len; } } public BOClient(string name) { this.Name = name; } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion #region IDataErrorInfo Members public string Error { get { return ""; } } public string this[string columnName] { get { return ""; } } #endregion }
现在,创建一个带有BindingSource调用" bindingSource1"的表单,然后将该类用作数据源。创建一个网格并将网格绑定到bindingsource1.
以这种形式在负载中使用以下代码:
private void Form1_Load(object sender, EventArgs e) { BindingList<BOClient> listClient = new BindingList<BOClient>(); listClient.Add(new BOClient("P1")); listClient.Add(new BOClient("P2")); listClient.Add(new BOClient("P3")); //using (MemoryStream mem = new MemoryStream()) //{ // BinaryFormatter b1 = new BinaryFormatter(); // try // { // b1.Serialize(mem, listClient); // } // catch (Exception ez) // { // MessageBox.Show(ez.Message); // } // BinaryFormatter b2 = new BinaryFormatter(); // try // { // mem.Position = 0; // listClient = (BindingList<BOClient>)b2.Deserialize(mem); // } // catch (Exception ez) // { // MessageBox.Show(ez.Message); // } //} this.bindingSource1.DataSource = listClient; }
我将序列化过程放在注释中,因为似乎没有它,它也会执行相同的怪异行为……现在启动应用程序。更改客户端名称。例如,"新名称"的示例为" p1",然后单击更改后的单元格。我们将看到" len"列未更改。但是,如果单击具有len的单元格,则会看到数字更改为正确的值。
有人知道为什么吗?
解决方案
我已经通过在BindingList中(通过继承)添加方法[OnDeserialization]解决了这个问题,我在代码中添加了在OnListChange上添加事件。这样,当1个属性更改时,整个行将刷新。