我有一个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中,即不是我的代码。
答案 0 :(得分:0)
尽量不要创建一个不需要它的DataTable。
我会删除它:
myData = new DataTable();
并且只有在我可以用数据填充它时才会创建它。事实上,除非你想从很多不同的地方使用它,否则你并不一定需要它作为表格的一部分。
我会称之为:
dataGridView1.DataSource = myData;
仅当工作线程完成所有加载时才<。p>
答案 1 :(得分:0)
除了我的datagridview绑定到列表之外,我遇到了同样的问题。当我说列表清除时,问题就出现了,所以我可以添加新值,这样列表就不会出错。我通过将数据源更改为其他内容来解决它,做了我需要的然后将其切换回来,但它不是最好的解决方法。
无论是否好,改变数据源是目前最安全的选择。但是,不是创建第二个数据表,而是更好:
dataGridView1.DataSource = null;
这样你就不需要费心去创建另一个数据表了。