我有一些事件会触发。所以我必须调用对实例状态和包含多个表单控件(如面板、图片框、按钮)的属性进行一些更改的方法。最后,这两个控件应该从一个 panel1 移动到另一个(panel2.add)。
所以我的线程有问题。用这样的功能改变一个标签是没有问题的:
private void SetText(string valuefromdifferentthread)
{
if (this.label1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { rfid });
}
else
{
label1.text="valuefromdifferentthread"
}
}
但是如何对几个控件进行更改?(没有为每个人编写方法,最后如何更改父控件)
我什至尝试将另一个事件处理程序放入 SomeClass StateChanged 中,该事件处理程序在“状态”变为“真”时触发(并且状态在触发第一个事件时变为真)但无论如何我在踩踏时遇到问题
“在一个线程上创建的控件不能作为另一个线程上的控件的父级。”
下面我写了我项目的假(小)代码
//--------------------------------------------------------------------------
List<SomeClass> allinstancesinList;
事件是
SerialPort.DataReceived+=dothis;
private void dothis(...)
{
var mystring=serialPort.ReadLine();
var curInstance=allinstancesinList.Single(w=>w.id=mystring);
curInstance.changed=true;
runthisfunction(curInstance);
}
runthisfunction(SomeClass sc)
{
//...here i make multiple operations with form controls of instance
sc._ContainerMainPanelBackgroundImageDefault=somepicture;
sc.__ContainerMainPanelBackColorSelected =backcolor;
//and finally i have to add to another panel
Panel2.add(sc.ContainerMainPanel);//which contains other panel and images
}
Class SomeClass
{
//...
PictureBox _ControlPictureBox;
Panel _ContainerMainPanel;
Label _ControlLabelName;
//BackgroundImage Clicked and default and ControlSelected;
Image _ContainerMainPanelBackgroundImageDefault;
Color _ContainerMainPanelBackColorDefault = Color.White;
Image _ContainerMainPanelBackgroundImageSelected;
Color _ContainerMainPanelBackColorSelected = Color.Yellow;
//...
}
感谢提前
我无法将我的问题作为答案发布(在 8 小时内),所以我通过 Martin Mulder 的 链接对其进行编辑(感谢他)我找到了一个非常简单的方法))))
private void DoGUISwitch()
{
Invoke( ( MethodInvoker ) delegate {
object1.Visible = true;
object2.Visible = false;
}
}