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后又委托一下,不多此一举吗?
frm.imageList1.Images.Add("text", ico);
ListViewItem item = new ListViewItem ("111", "text");
frm.listView1.Items.Add(item);
直接这样不行吗?干嘛非得Invoke后又委托一下,不多此一举吗?
#2
这是在非主线程中操作主线程的控件,好像直接调用不安全?
求解
#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);
}));
那你改成这样试试
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
你这已经另定义一个form了。怎么会是操作主线程的控件呢?
概念混了吧。。
frm这玩意已经不是你主线程所在的Form了。
#5
#6
在主线程里定义个个委托。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。
#7
我表达的不够准确!
应该是在其他类的函数中更新主窗口的控件内容。
#8
一样的啊。委托处理函数是定义在主线程里的。只是调用下而已。。。
实际上是在主线程里更新的主窗口的控件。
实际上是在主线程里更新的主窗口的控件。
#9
好的,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后又委托一下,不多此一举吗?
frm.imageList1.Images.Add("text", ico);
ListViewItem item = new ListViewItem ("111", "text");
frm.listView1.Items.Add(item);
直接这样不行吗?干嘛非得Invoke后又委托一下,不多此一举吗?
#2
这是在非主线程中操作主线程的控件,好像直接调用不安全?
求解
#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);
}));
那你改成这样试试
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
你这已经另定义一个form了。怎么会是操作主线程的控件呢?
概念混了吧。。
frm这玩意已经不是你主线程所在的Form了。
#5
#6
在主线程里定义个个委托。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。
在你的类里定义个委托变量,在主线程里为你这个类的委托变量赋值。
然后在你的类里调用这个委托就可以了。
#7
我表达的不够准确!
应该是在其他类的函数中更新主窗口的控件内容。
#8
一样的啊。委托处理函数是定义在主线程里的。只是调用下而已。。。
实际上是在主线程里更新的主窗口的控件。
实际上是在主线程里更新的主窗口的控件。
#9
好的,3q
#10
你的窗体创建出来了,为什么没有使用form的show或者showdiaolog方法呢?
如果调用了的话,应该就不会出错了
如果调用了的话,应该就不会出错了