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

时间:2022-08-27 17:16:33
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。
请问应该怎么改

10 个解决方案

#1


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

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

#2


引用 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后又……


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

#3


哦,线程里操作吧
那你改成这样试试
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);
 
                    }));
 

#4


引用 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了。

#5


Quote: 引用 4 楼 lye2000000_super 的回复:


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

#6


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

#7


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


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

#8


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

#9


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


好的,3q

#10


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

#1


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

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

#2


引用 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后又……


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

#3


哦,线程里操作吧
那你改成这样试试
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);
 
                    }));
 

#4


引用 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了。

#5


Quote: 引用 4 楼 lye2000000_super 的回复:


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

#6


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

#7


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


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

#8


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

#9


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


好的,3q

#10


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