无法使DataGridView多次绑定到数据源

时间:2015-06-02 15:56:47

标签: c# multithreading winforms data-binding datagridview

我有一个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;
}

它仍然不起作用。我做错了什么?

2 个答案:

答案 0 :(得分:3)

DataGridView不会更新,因为您使用相同的列表实例来设置.DataSourceDataGridView 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;
}