0

私は発火するいくつかのイベントを持っています。そのため、インスタンスの状態と、パネル、ピクチャボックス、ボタンなどの複数のフォームコントロールを含むプロパティにいくつかの変更を加えるメソッドを呼び出す必要があります。最後に、これらの 2 つのコントロールを 1 つの panel1 から別の panel1 に移動する必要があります (panel2.add)。

だから私はスレッドに問題があります。このような関数で 1 つのラベルを変更しても問題ありません。

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;
    }
} 
4

0 に答える 0