C# 无法对控件调用Invoke或BeginInvoke。。。甚至使用CreateControl()也可以

C# 无法对控件调用Invoke或BeginInvoke。。。甚至使用CreateControl()也可以,c#,invoke,C#,Invoke,我无法从我的表单1修改属于表单2的元素 public partial class Project : Form { public Form2 form = new Form2(); public Project() { InitializeComponent(); } private void Project_Load(object sender, EventArgs e) { form.CreateContro

我无法从我的表单1修改属于表单2的元素

public partial class Project : Form
{
    public Form2 form = new Form2();

    public Project()
    {
        InitializeComponent();
    }

    private void Project_Load(object sender, EventArgs e)
    {
        form.CreateControl();
    }

    private void buttonOpenForm2_Click(object sender, EventArgs e)
    {
        form.Show();
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        var indata = *whatever serial input data here*
        bool result = Int32.TryParse(indata, out int data);

        if (result) {
        form.chart1.Invoke(new Action(() => { form.chart1.Series[0].Points.AddY(data); }));
        }
    }
每当我按下按钮以显示Form2及其图表时,form.chart1.Invoke中都会引发异常。在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke


如果我强制窗体执行CreateControl,为什么会发生这种情况?

错误消息会告诉您出了什么问题

在保存图表的form2完全创建之前,串行端口已启动

我想你可以看看这面可见的旗子,可能还有很多其他的

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{

   ...

   if(!form?.Visible)
      return;

   form.chart1.Invoke(...
假设它不可见,您就不想显示数据

进一步阅读

应用程序启动和关闭事件

窗体和控件类公开了一组与 应用程序启动和关闭。当Windows窗体应用程序 启动时,主窗体的启动事件在 顺序如下:

Control.HandleCreated

Control.BindingContextChanged

形式.加载

控件。可见更改

形式。激活

表格。如图所示


Windows窗体在封面下使用Windows User32、Gdi32和其他传统的Windows库。实例化表单对象时,将为Windows窗口创建一个空心包装器。当您显示窗体时,一个复杂的舞蹈开始,在某一点上调用传统的窗口创建函数来创建窗口和窗口的窗口句柄。在那之前,有些事情你不能做。因此,在Form2完全完成自身创建之前,它肯定是由Form.Load事件完成的,您不能调用表单上的任何内容