[英]“Invoke or BeginInvoke cannot be called on a control until the window handle has been created” only occurs the second time form opens
[英]Cannot invoke changes in form a second time
我嘗試編寫一個應用程序,我需要通過 COM 端口使用掃描儀。 我為此使用了啟用的 SerialPort object,在主窗體中掃描工作正常。
然后我使用一個按鈕來切換主窗體是否應該能夠執行ReadExisting()
方法。
private void ScannerDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();`
if (string.IsNullOrEmpty(indata))
{
return;
}
Invoke(new MethodInvoker(delegate { cbValues.SelectedItem = values; }));
}
catch (Exception ex)
{
log.Error($"{ex}");
}
}
(cbValues 是一個 ComboBox)(System.IO.Ports.SerialPort)
在我的主窗體中,我使用它來創建一個新窗體:
var form = new Form2(_data, scanner);
form.ShowDialog();
然后表格按預期顯示。 第一次嘗試以新形式掃描內容時,一切正常。
然后我關閉“子”表單。
然后我重新打開它並顯示它並觸發掃描儀事件。
這是我的構造函數:
InitializeComponent();
HandleCreated += new EventHandler((sender, args) =>
{
scanner.DataReceived += new SerialDataReceivedEventHandler(ScannerDataReceivedHandler);
});
在我的事件中,我嘗試調用 combobox 中的更改。
BeginInvoke(new MethodInvoker(delegate { cbValues.SelectedItem = values; }));
在我的第二次嘗試中,表單未創建 (IsCreated = false) 並且沒有句柄 (IsHandleCreated = false),盡管它是可見的並且對掃描儀有反應。
我無法繞過它。 我也嘗試using
表單在使用后將其處理掉,但它不起作用。
有人猜到了嗎?
我解決了。
它很丑陋,但它有效。
我希望未來的我會有一個很好的解決方案。
解決辦法:通過scanner.Close scanner.Close()
關閉SerialPort
object,用另一種形式打開。
掃描完所有內容后,關閉Form2_FormClosing(object sender, FormClosingEventArgs e)
上的 object。
我仔細閱讀了您的帖子和代碼。 據我了解, scanner
是MainForm
的成員變量,您將其作為參數傳遞給Form2
構造函數。 不僅僅是猜測,我所看到的是一種迂回的方式來訂閱應該在scanner
實例化后立即附加到主窗體中的事件。
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
scanner = new Scanner();
scanner.DataReceived += ScannerDataReceivedHandler;
}
// F O R E X A M P L E
// The class name `Scanner` is just a placeholder for this example.
// The point is, it's being declared/instantiated "somewhere".
private readonly Scanner scanner;
private void ScannerDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
// Do something
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.