这是我的问题: 我有一个DataGridView绑定到自定义对象的BindingList。后台线程不断更新这些对象的值。 udpates正确显示,一切都很好,除了一件事 - 如果您在更新后台更新字段时尝试编辑其他字段,则会丢失输入的值。这是一个演示此行为的代码示例: (对于新表单,删除新的DataGridView:)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private BindingList<foo> flist;
private Thread thrd;
private BindingSource b;
public Form1()
{
InitializeComponent();
flist = new BindingList<foo>
{
new foo(){a =1,b = 1, c=1},
new foo(){a =1,b = 1, c=1},
new foo(){a =1,b = 1, c=1},
new foo(){a =1,b = 1, c=1}
};
b = new BindingSource();
b.DataSource = flist;
dataGridView1.DataSource = b;
thrd = new Thread(new ThreadStart(updPRoc));
thrd.Start();
}
private void upd()
{
flist.ToList().ForEach(f=>f.c++);
}
private void updPRoc()
{
while (true)
{
this.BeginInvoke(new MethodInvoker(upd));
Thread.Sleep(1000);
}
}
}
public class foo:INotifyPropertyChanged
{
private int _c;
public int a { get; set; }
public int b { get; set; }
public int c
{
get {return _c;}
set
{
_c = value;
if (PropertyChanged!= null)
PropertyChanged(this,new PropertyChangedEventArgs("c"));
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
因此,您编辑a或b列,您会看到c更新列会导致您丢失参赛作品。
任何想法都赞赏。
答案 0 :(得分:0)
我玩过你的代码。似乎正在发生的事情是,只要添加新行,就会通过'DataGridView的添加行功能自动将新的“foo”对象添加到BindingList
。由于它与集合中的对象一样有效,因此它的'c'参数将由您实现的线程函数递增,并且您的输入更改将丢失,因为PropertyChangedEvent触发将导致'DataGridView'刷新。
我建议您输入不同的视图或表单,输入新对象的信息。然后在OK,将新的foo对象添加到列表中。这样就无法直接从我知道的DataGridView添加行,并且如果你愿意,可以和我争论,但你可以在其他地方进行所有验证。您想要在UI代码中编写所有验证和更正检查的代码吗?您是否希望用户处理“您需要一个号码而不是那里的文字!”其余DataGridView正在更新的消息?可能有点令人沮丧。
此外,如果数据要不断变化,那么从gridview可以编辑数据几乎没有意义。您需要一种连接方法范例到数据源,其中一些是不断变化的......您可能想重新考虑如何显示这些信息,并让用户看到数据并以不同的方式对其进行编辑。
我的5美分。
祝你好运yoni,很高兴看到数字变得疯狂,我理解你的问题。
Leo Bruzzaniti
答案 1 :(得分:0)
在将datagridview的currentCell属性保存为空之前,它会从正在编辑的单元格中失去焦点