【发布时间】:2018-12-28 08:05:41
【问题描述】:
我无法从我的 Form1 修改属于 Form 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(),为什么会发生这种情况?
【问题讨论】:
-
Windows 窗体在后台使用 Windows User32、Gdi32 和其他传统 Windows 库。当您实例化一个 Form 对象时,您为 Windows 窗口创建了一个空心包装器。当您显示表单时,一个复杂的舞蹈开始了,有一次调用传统的 Windows
Create函数来创建窗口(以及窗口的窗口句柄)。在那之前,有些事情是你不能做的。因此,直到您的 Form2 完全完成自我创建(它肯定由Form.Load事件完成)之前,您不能Invoke表单上的任何内容