Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C从Form1中的函数访问Form1元素_C#_Winforms_Object_Static - Fatal编程技术网

C# C从Form1中的函数访问Form1元素

C# C从Form1中的函数访问Form1元素,c#,winforms,object,static,C#,Winforms,Object,Static,我正在尝试为一个项目创建一个C应用程序。由于我没有C语言的经验,我很难理解如何引用表单元素。我需要从函数中更改richTextBox1内容,并从DataReceivedHandler中引用它。代码如下: private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; Form1 myform = n

我正在尝试为一个项目创建一个C应用程序。由于我没有C语言的经验,我很难理解如何引用表单元素。我需要从函数中更改richTextBox1内容,并从DataReceivedHandler中引用它。代码如下:

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    Form1 myform = new Form1();
    string indata = sp.ReadExisting();
    Debug.Print("Data Received:");
    Debug.Print(indata);
    addRichBox(indata); //????Problematic Line????
}

public void addRichBox(String text)
{
    String x;
    x = richTextBox1.Text;
    richTextBox1.Text = text + Environment.NewLine + x;

    richTextBox1.SelectionStart = richTextBox1.Text.Length;
    richTextBox1.ScrollToCaret();
}
我想做的只是在DataReceivedHandler中调用addRichBox函数,但它给出了一个错误,即非静态字段、方法或属性需要对象引用。我尝试过使addRichBox成为静态的,并使用类似的东西。addRichBox,但这些似乎不起作用。我如何解决这个问题?提前谢谢

编辑 现在可以了。我做了一些挖掘,并找到了如何调用。这是:

public void addRichBox(String text)
{

    richTextBox1.BeginInvoke(new MethodInvoker(() => richTextBox1.AppendText(text)));
    richTextBox1.BeginInvoke(new MethodInvoker(() => richTextBox1.SelectionStart = richTextBox1.Text.Length));
    richTextBox1.BeginInvoke(new MethodInvoker(() => richTextBox1.ScrollToCaret()));

}

你有两个问题。您必须从DataReceivedHandler方法中删除static,以便可以直接调用addRichBox之类的实例方法。它在工作线程上运行,这需要使用表单的BeginInvoke方法来保持线程安全。当您发现消防水管问题时,您会遇到第三个问题,接收数据的速度比显示数据的速度快,您会从UI冻结中注意到。当删除静态关键字时,会引发System.InvalidoOperationException。是的,这就是我明确提到您有两个问题的原因。您必须使用BeginInvoke。