我发生了一些事件。所以我要调用方法,它在实例的状态和他的属性中进行了一些更改,其中包含多个表单控件,如面板,图片框,按钮。最后,这些控件应该从一个panel1移动到另一个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添加另一个事件处理程序,当“state”变为“true”时触发(并且当触发第一个事件时状态变为true)但是无论如何我有踩踏问题
“在一个线程上创建的控件不能作为另一个线程上的控件的父级。”
下面我写了我的项目的假(小)代码
//--------------------------------------------------------------------------
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的link(感谢他),我发现了一种非常简单的方式))))
private void DoGUISwitch()
{
Invoke( ( MethodInvoker ) delegate {
object1.Visible = true;
object2.Visible = false;
}
}