从事件处理程序访问GUI

时间:2011-11-02 18:28:29

标签: c#

当收到串口的字节时,它会正确进入该处理程序,但GUI上的标签不会改变。 编辑:是的,它与GUI在同一个类中 编辑2 函数声明不需要是“静态的”...我只是从msdn复制粘贴an example 编辑3 在摆脱静态删除并使用类似this之类的内容后,它可以正常工作。 谢谢你的帮助

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Form1 gui = new Form1(); //main GUI

            try
            {
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                //gui.rxLabel.Text = indata;
                gui.txLabel.Text = "testttingg";
            }
            .......

2 个答案:

答案 0 :(得分:6)

为什么要声明表单的新实例?只需使用表单txLabel

即可

在c#中:

this.txLabel.Text = "testing";

在vb.net中:

Me.txLabel.Text = "testing"

在您发布的示例代码中,您正在创建实际表单的新实例/引用。此外,使用现有实例,使用this而不是新实例。

我必须编辑我的问题,因为我注意到你正在使用静态方法。

试试这个:

 public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Form1 f = (Form1) sender;

            f.textBox1.Text = "testing";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            DataReceivedHandler(this, null);     
        }

当然我只是从按钮事件中调用DataReceivedHandler(),您可以从自己的事件中调用它。要点是你需要将当前实例this传递给函数。一旦在函数内部不创建表单的新实例,只需设置对当前表单的引用,并使用该引用将设置应用于属性(txtBox或Label或其他)。

答案 1 :(得分:0)

您似乎正在实例化Form1的新实例,而不是访问内存中的现有表单。