界面调用 Controls.AddRange 出错

shidifeng 2005-02-01 08:53:25
用出现问题
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.panel5,this.panel1});
错误信息如下
System.ArgumentException: Controls created on one thread cannot be parented to a control on a different thread.
at System.Windows.Forms.ControlCollection.Add(Control value)
at System.Windows.Forms.ControlCollection.Add(Control value)
at System.Windows.Forms.ControlCollection.AddRange(Control[] controls)
忽视错误信息,按Continue , 再重新开启这个窗口, 界面又正常显示;
我界面的操作过程是这样的,SDI框架,左边是个OutLookbar,点击OutLookBar按钮,
出现窗口
...全文
303 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
isaacyh 2005-02-01
  • 打赏
  • 举报
回复
呵呵,楼上的说得对,Control对于多线程是非安全的。它只是符合微软的STA模式,你想在多线程中添加得通过异步调用通知界面那个线程,通过界面的BeginInvoke方法再将control加上去,或者参考MSDN中的那个STA的例子,按它那样写程序。
sun926 2005-02-01
  • 打赏
  • 举报
回复
显然是多线程的问题,Form可以在任何线程中创建,但是创建出来的窗体将不能切换到其他的线程,
所以你的问题可能是OutlookBar中使用了多线程,当点击按钮的时候新建的窗口所在的线程与Controls.AddRange所在的不同
liulxmooo 2005-02-01
  • 打赏
  • 举报
回复
up
shidifeng 2005-02-01
  • 打赏
  • 举报
回复
在Mdi的构造函数中 直接生成outlookbar 界面 ,加了一个线程只是启动一个另外一个exe程序
跟界面没关系,在outlookbar点击事件中没有用多线程
sun926 2005-02-01
  • 打赏
  • 举报
回复
关键不是在那个方法中,而是你的窗体是在哪个线程中创建的。
shidifeng 2005-02-01
  • 打赏
  • 举报
回复
Controls.addRanges() 方法在 创建的窗口InitializeComponent()方法中, 还会有多线程的问题吗

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧