【问题标题】:Cannot make DataGridView to bind to data source more than once无法使 DataGridView 多次绑定到数据源
【发布时间】:2015-08-16 12:45:20
【问题描述】:

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

还是不行。我做错了什么?

【问题讨论】:

  • 你能显示一些FinishedTests_Loops_DGV变量的代码吗?

标签: c# multithreading winforms data-binding datagridview


【解决方案1】:

我认为您的问题是您尝试不正确地设置数据源。

您说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;
}

【讨论】:

  • 在问题的第一行:我有一个名为FinishedTests_Loops_DGV的简单类列表
【解决方案2】:

DataGridView 不会更新,因为您使用相同的列表实例来设置.DataSource(DataGridView Reference source)

那么List&lt;T&gt; 不支持集合更改的通知。
DataGridView 永远不会知道列表中的更改

改用BindingList&lt;T&gt;,那么只绑定一次DataSource就足够了。
并且添加的项目会自动显示在DataGridView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2014-09-15
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多