不能在控件上调用 Invoke 或 BeginInvoke.甚至使用 CreateControl()



我无法从我的 Form1 修改属于表单 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 or BeginInvoke cannot be called on a control until the window handle has been created.

如果我强迫form做一个CreateControl(),为什么会发生这种情况?

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

您的串行端口在完全创建form2(保存您的图表)之前触发

我想你可以检查可见的标志(可能还有很多其他的)

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
   ...
   if(!form?.Visible)
      return;
   form.chart1.Invoke(...

假设如果它不可见,则您不想显示数据


延伸阅读

Windows 窗体中的事件顺序

应用程序启动和关闭事件

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

控件.句柄创建

Control.BindingContextChanged

表单加载

控件.可见更改

表单已激活

表格所示

相关内容

  • 没有找到相关文章

最新更新