我有一个Winforms GUI应用程序。我有一个名为FinishedTests_Loops_DGV
的简单类列表。此列表正在添加到另一个线程(计时器线程)中。将新类添加到列表(在计时器线程内)后,我调用updateLoopsDGV()
调用DataGridView
并更新它:
public void updateLoopsDGV()
{
if (DGV_Loops.InvokeRequired)
{
DGV_Loops.BeginInvoke((MethodInvoker)delegate()
{
DGV_Loops.DataSource = FinishedTests_Loops_DGV;
});
}
}
这只能一次,这意味着一旦第一个元素添加到列表中,我看到第一行显示在DataGridView
中,但是对updateLoopsDGV()
的任何进一步调用不要向DataGridView
添加行。我在调试器中检查了我的列表,例如4个元素长,并调用了函数,但我仍然只看到DataGridView
中的1行。
即使我尝试通过按某个按钮(在GUI线程中)来更新DataGridView
:
private void button3_Click(object sender, EventArgs e)
{
DGV_Loops.DataSource = FinishedTests_Loops_DGV;
}
它仍然不起作用。我做错了什么?
答案 0 :(得分:3)
DataGridView
不会更新,因为您使用相同的列表实例来设置.DataSource
(DataGridView Reference source)
然后List<T>
不支持收集更改的通知
DataGridView
永远不会知道列表中的更改
改为使用BindingList<T>
,只需将其绑定到DataSource
一次就足够了
添加的项目将自动显示在DataGridView
答案 1 :(得分:0)
我认为您的问题是您正在尝试不正确地设置数据源。
您说FinishedTests_Loops_DGV
是一个类,并将其作为DataSource
提供。这很奇怪,因为它绑定到Type
对象,而不是实际列表。
我认为你应该创建一个IEnumerable<FinishedTests_Loops_DGV>
变量并将其作为DataSource
提供,如下所示:
IEnumerable<FinishedTests_Loops_DGV> aList = ...; // actual data get
private void button3_Click(object sender, EventArgs e)
{
DGV_Loops.DataSource = aList;
}