从BackgroundWorker更新DataGridView数据源时出错

时间:2011-09-09 10:24:35

标签: c# winforms datagridview backgroundworker

我有一个DataGridView,它使用DataTable作为其数据源。我还有一个BackgroundWorker来更新DataTable对象。这会在更新DataTable对象时警告IndexOutOfRange异常。如果我在主UI线程上更新了DataTable,则没有例外。

如何防止此异常?我只是更新DataTable,而不是重新分配数据源。

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中,即不是我的代码。

2 个答案:

答案 0 :(得分:0)

尽量不要创建一个不需要它的DataTable。

我会删除它:

myData = new DataTable();

并且只有在我可以用数据填充它时才会创建它。事实上,除非你想从很多不同的地方使用它,否则你并不一定需要它作为表格的一部分。

我会称之为:

dataGridView1.DataSource = myData;

仅当工作线程完成所有加载时才<。p>

答案 1 :(得分:0)

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

无论是否好,改变数据源是目前最安全的选择。但是,不是创建第二个数据表,而是更好:

dataGridView1.DataSource = null;

这样你就不需要费心去创建另一个数据表了。