簡體   English   中英

從另一個表單的按鈕單擊事件訪問后台工作者

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM