WPF使用BackgroundWorker操作DataTable报错
我在UserControl的Load事件中初始化一个BackgroundWorker,并定义了相关事件,代码如下:
this._bgWorkor = new BackgroundWorker();
this._bgWorkor.WorkerReportsProgress = true;
this._bgWorkor.DoWork += new DoWorkEventHandler(_bgWorkor_DoWork);
this._bgWorkor.ProgressChanged += new ProgressChangedEventHandler(_bgWorkor_ProgressChanged);
this._bgWorkor.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgWorkor_RunWorkerCompleted);
然后获取到一个DataTable数据表,并作为参数传递到DoWork中,在DoWork中遍历该DataTable,将遍历的每一行记录都传递到ProgressChanged中,并将该记录添加到另外一个结构相同的DataTable中,错误就出现在这个时候,添加到DataTable中的时候总是提示“未将对象引用设置到对象的实例。”
具体代码如下:
void _bgWorkor_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage > 0)
{
DataRow dr = (DataRow)e.UserState;
object[] items = new object[dr.ItemArray.Count()];
dr.ItemArray.CopyTo(items, 0);
//执行到下面这一句就提示那个异常错误了
this._DtGuests.Rows.Add(items);
this.spInfo.Content = new TextBlock
{
Text = items[6].ToString(),
Foreground = Brushes.Red,
VerticalAlignment = VerticalAlignment.Center
};
//this.Dispatcher.BeginInvoke(new Action(() =>
//{
//}));
}
}
void _bgWorkor_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dtGuest = (DataTable)e.Argument;
foreach (DataRow dr in dtGuest.Rows)
{
DataRow drNew = this._DtGuests.NewRow();
int result = this._Dao.ExecuteNonQuery(sql, parameters);
((BackgroundWorker)sender).ReportProgress(result, drNew);
}
}
请问这到底是什么原因造成的呢?
[解决办法]
_DtGuests 是null?
[解决办法]
我想,luoSaiMingJavaAndC的意思是,你的_DtGuests是不是没有实例化
[解决办法]
---_bgWorkor_DoWork
((BackgroundWorker)sender).ReportProgress(result,?drNew);//在这里传入了drNew,应该传dr
--_bgWorkor_ProgressChanged
DataRow dr = (DataRow)e.UserState;//这里取到的是drNew,而实际上是想取dr的数据
你传的是drNew,里面什么都没有,达不到拷贝的目的。
其他的没有问题,根据错误提示检查一下对象的创建。
[解决办法]
猜猜看了
是不是在 ._DtGuests.NewRow() 前 就添加行了?
BackgroundWorker 忘却了