在一个线程上创建的控件不能作为另一个线程上的控件的父级。如何管理多个控件?

时间:2013-04-26 14:52:51

标签: c# multithreading winforms

我发生了一些事件。所以我要调用方法,它在实例的状态和他的属性中进行了一些更改,其中包含多个表单控件,如面板,图片框,按钮。最后,这些控件应该从一个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;
    }
} 

0 个答案:

没有答案