【问题标题】:error updating DataGridView data source from BackgroundWorker从 BackgroundWorker 更新 DataGridView 数据源时出错
【发布时间】:2011-09-09 10:24:35
【问题描述】:

我有一个使用 DataTable 作为其数据源的 DataGridView。我还有一个更新 DataTable 对象的 BackgroundWorker。这会在更新 DataTable 对象时导致 IndexOutOfRange 异常。如果我在主 UI 线程上更新了 DataTable,也不例外。

我怎样才能防止这个异常?我只是在更新 DataTable,而不是重新分配 Datasource。

public partial class Form1 : Form
{
     DataTable myData = null;
     BackgroundWorker worker = new BackgroundWorker();

     public Form1()
    {
        InitializeComponent();
        myData = new DataTable();         
    }

     private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = myData;
    }

     private void button1_Click(object sender, EventArgs e)
    {
         worker.DoWork += new DoWorkEventHandler(PopulateData);
         worker.RunWorkerAsync();
    }

     private void PopulateData(object sender, DoWorkEventArgs e)
    {
          ......
          //update datatable
          myDataAdapter.Fill(myData); //Exception caused by this call
     }
}

编辑:我可以通过创建第二个 DataTable 对象并对其进行更新来解决此问题,然后在 BackgroundWorker RunWorkerCompleted 事件中设置 Datasource DataTable = 更新的 DataTable,但必须拥有两个 DataTable 似乎有点愚蠢并且浪费资源。

编辑:异常被抛出

Application.Run(new Form1());

在 Program.cs 中,即不是我的代码。

【问题讨论】:

  • 会帮你贴一些相关的代码
  • 能否请您发布一些代码。你调试过你的代码吗?
  • 恕我直言,WPF 使用的并发内存模型太容易出现此类问题。 ://
  • 我认为代码太简单了,无法发布。 @Gleno 这是直接的 WinForms,而不是 WPF。

标签: c# winforms datagridview backgroundworker


【解决方案1】:

尽量不要在不需要的地方创建 DataTable。

我会删除这个:

myData = new DataTable();

只有当我可以用数据填充它时才会创建它。事实上,除非您想在许多不同的地方使用它,否则您并不绝对需要它作为表单的一部分。

然后我会称它为:

dataGridView1.DataSource = myData;

仅当工作线程完成所有负载时。

【讨论】:

    【解决方案2】:

    除了我的 datagridview 绑定到列表之外,我遇到了与您相同的问题。当我说要清除列表时,我遇到了问题,这样我就可以添加新值,这样列表就不会不正确。我通过将数据源更改为其他东西来解决它,做了我需要的然后将其切换回来,但这不是最好的解决方法。

    无论好坏,更改数据源都是目前最安全的选择。然而,与其创建第二个数据表,不如这样做:

    dataGridView1.DataSource = null;
    

    这样您就不必费心创建另一个数据表了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多