我无法从我的 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
表单加载
控件.可见更改
表单已激活
表格所示