c# 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

.Net技术 码拜 10年前 (2015-05-10) 4087次浏览 0个评论
 

Form_main frm = new Form_main();
frm.Invoke(new MethodInvoker(delegate()
                    {
                        //do something…

                        frm.imageList1.Images.Add(“text”, ico);
                        ListViewItem item = new ListViewItem        (“111”, “text”);
                        frm.listView1.Items.Add(item);

                    }));

这是在另一个类中的一个非主线程调用form_main窗口控件的代码,提示出错!
 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
请问应该怎么改

Form_main frm = new Form_main();
frm.imageList1.Images.Add(“text”, ico);
ListViewItem item = new ListViewItem (“111”, “text”);
frm.listView1.Items.Add(item);
 

直接这样不行吗?干嘛非得Invoke后又委托一下,不多此一举吗?

引用 1 楼 gxingmin 的回复:

Form_main frm = new Form_main();
frm.imageList1.Images.Add(“text”, ico);
ListViewItem item = new ListViewItem (“111”, “text”);
frm.listView1.Items.Add(item);
 

直接这样不行吗?干嘛非得Invoke后又……

这是在非主线程中操作主线程的控件,好像直接调用不安全?
求解

哦,线程里操作吧
那你改成这样试试
Form_main frm = new Form_main();
this.Invoke(new MethodInvoker(delegate()
                     {
                         //do something…
 
                        frm.imageList1.Images.Add(“text”, ico);
                         ListViewItem item = new ListViewItem        (“111”, “text”);
                         frm.listView1.Items.Add(item);
 
                    }));
 
引用 2 楼 qq664282970 的回复:

引用 1 楼 gxingmin 的回复:Form_main frm = new Form_main();
frm.imageList1.Images.Add(“text”, ico);
ListViewItem item = new ListViewItem (“111”, “text”);
frm.listView1.Items.Add(item);
 

……

你这已经另定义一个form了。怎么会是操作主线程的控件呢?
概念混了吧。。
frm这玩意已经不是你主线程所在的Form了。

Quote: 引用 4 楼 lye2000000_super 的回复:

我刚发现这个问题了,请问怎么在另一个线程里更新主窗口的控件内容呢?

40分
在主线程里定义个个委托。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。
引用 6 楼 lye2000000_super 的回复:

在主线程里定义个个委托。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。

我表达的不够准确!
应该是在其他类的函数中更新主窗口的控件内容。

一样的啊。委托处理函数是定义在主线程里的。只是调用下而已。。。
实际上是在主线程里更新的主窗口的控件。
引用 8 楼 lye2000000_super 的回复:

一样的啊。委托处理函数是定义在主线程里的。只是调用下而已。。。
实际上是在主线程里更新的主窗口的控件。

好的,3q

你的窗体创建出来了,为什么没有使用form的show或者showdiaolog方法呢?
如果调用了的话,应该就不会出错了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!