[英]Accessing background worker from another form's button click event
我在C#中慢慢走過去,但是肯定在以下代碼中笑了:
// create an instance of the main form
public formMain _formMain;
public void btnDynaDotCheck_Click(object sender, EventArgs e)
{
if (_formMain.bgWorker.IsBusy != true)
{
this.btnDynaDotCheck.Enabled = false;
_formMain.bgWorker.RunWorkerAsync("dr_begin_dd_check");
}
else
{
_formMain.returnMessage("Please wait untill the current task is finished...");
return;
}
}
我正在嘗試從anotherForm.cs訪問formMain.cs中的后台工作程序,VS中沒有錯誤,但是運行時我得到了
“和”其他信息:對象引用未設置為對象的實例。”中發生了'System.NullReferenceException類型的未處理異常。”
在這行上:
if (_formMain.bgWorker.IsBusy != true)
所以在這種情況下我不是很容易訪問嗎?
_formMain = Application.OpenForms["formMain"];
單擊按鈕添加此代碼,然后嘗試。
當從anotherForm
訪問_formMain
時:
我認為anotherForm
被實例化,並呼吁從_formMain
是這樣的:
anotherForm _anotherForm = new anotherForm();
_anotherForm.Show();
現在有幾種方法可以從_anotherForm
訪問_formMain
,但是我認為最簡單的方法是將_formMain
設置為_formMain
的父_anotherForm
:
_anotherForm.Parent = this; // insert before _anotherForm.Show()
這樣,您可以像這樣在_anotherForm
獲取它
public void btnDynaDotCheck_Click(object sender, EventArgs e)
{
...
formMain _formMain = this.Parent as formMain;
if(_formMain != null)
{
... // do whatever ever you have to do
}
}
但是要小心...在_formMain
獲取BackgroundWorker
要求您可以調用並返回BackgroundWorker
公共方法。
希望這可以幫助!
使用依賴注入將對您的主表單的引用注入到另一個人中:在主表單代碼中的某處執行以下操作:
anotherForm _anotherForm = new anotherForm(this);
_anotherForm.Show();
假設你的MainForm的內創建從代碼anotherform, this
實際上指的是MainForm的。 在anotherFrom的構造函數中執行以下操作:
public anotherForm(MainForm formMain){
_formMain = formMain;
}
到目前為止,這是解決此問題的最優雅的方法。 因為可以清楚地看出一種形式與另一種形式之間存在依賴性,並且可以使設計意圖明確。
也可以使用父級,但前提是主窗體確實是其他窗體的父級。
通過Application對象可以工作,但是應用程序對象是全局對象,因此您可以隱藏依賴項。
謝謝你們的幫助:)
我現在有:
// create an instance of the formMain
formMain _formMain = new formMain();
public void btnDynaDotCheck_Click(object sender, EventArgs e)
{
if (_formMain.bgWorker.IsBusy != true)
{
this.btnDynaDotCheck.Enabled = false;
_formMain.bgWorker.RunWorkerAsync("dr_begin_dd_check");
}
else
{
_formMain.returnMessage("Please wait untill the current task is finished...");
return;
}
}
哪個有效:)它通過以下主要形式實現:
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
// action to string format
string action = e.Argument as string;
if (action == "dr_begin_dd_check")
{
BeginInvoke((Action)(() =>
{
statusLabel.Text = "Access the bgw...";
}
));
} // dr_begin_dd_check
我現在在formMain中遇到錯誤:
在創建窗口句柄之前,無法在控件上調用Invoke或BeginInvoke。
我不確定錯誤在上面的代碼中還是實際上在formMain部分中,或者我應該打開一個新問題? :)
歡呼的家伙
格雷厄姆
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.