首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

WPF应用BackgroundWorker操作DataTable报错

2012-12-29 
WPF使用BackgroundWorker操作DataTable报错我在UserControl的Load事件中初始化一个BackgroundWorker,并定

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 忘却了··

热点排行