Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个表单访问后台工作人员';s按钮单击事件_C# - Fatal编程技术网

C# 从另一个表单访问后台工作人员';s按钮单击事件

C# 从另一个表单访问后台工作人员';s按钮单击事件,c#,C#,我在c#上慢慢地,但肯定会在代码中lol: // create an instance of the main form public formMain _formMain; public void btnDynaDotCheck_Click(object sender, EventArgs e) { if (_formMain.bgWorker.IsBusy != true) { this.btnDynaD

我在c#上慢慢地,但肯定会在代码中lol:

    // 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;
        }
    }
我正在尝试从另一个form.cs访问formMain.cs中的后台工作程序。VS中没有错误,但运行时我得到

“类型为'System.NullReferenceException'的未处理异常” 发生在“和”附加信息中:对象引用未设置为 对象的实例。”

在这一行:

if (_formMain.bgWorker.IsBusy != true)
所以在这种情况下我并没有真正获得访问权,嗯

_formMain = Application.OpenForms["formMain"];

在按钮中添加此代码,单击并尝试。

从另一个窗体访问
时:

_anotherForm.Parent = this; // insert before _anotherForm.Show()
我假设另一个表单被实例化并从
\u formMain
调用,如下所示:

anotherForm _anotherForm = new anotherForm();
_anotherForm.Show();
现在有几种方法可以从另一个窗体访问
\u formMain
,但我认为最简单的方法是将
\u formMain
设置为另一个窗体的父窗体:

_anotherForm.Parent = this; // insert before _anotherForm.Show()
这样你就可以像这样在另一种形式中获得它

public void btnDynaDotCheck_Click(object sender, EventArgs e)
{
    ...
    formMain _formMain = this.Parent as formMain;
    if(_formMain != null)
    { 
       ... // do whatever ever you have to do
    }
}
但是要小心。。。在
\u formMain
中获取您的
BackgroundWorker
需要公共方法,您可以调用并返回您的
BackgroundWorker


希望这有帮助

使用依赖项注入将对mainform的引用注入到另一个mainform中:在mainform代码中的某个地方执行以下操作:

anotherForm _anotherForm = new anotherForm(this);
_anotherForm.Show();
假设您正在从主窗体中的代码创建另一个窗体,
这实际上是指主窗体。
在anotherFrom的构造函数中,执行以下操作:

public anotherForm(MainForm formMain){
    _formMain = formMain;
}
这是迄今为止解决这个问题最优雅的方式。因为它清楚地表明了从一种形式到另一种形式之间存在依赖关系,并且清楚地表明了设计意图

使用父窗体也可以,但前提是主窗体确实是另一个窗体的父窗体

通过应用程序对象可以工作,但应用程序对象是一个全局对象,您可以通过这种方式隐藏您的依赖关系。

谢谢大家的帮助:)

我现在有:

    // 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部分中的错误在哪里,或者我应该打开一个新问题吗?:)

干杯,伙计们


Graham

我猜
\u formMain==null
因为您没有实例化它。我同意stefankmitph的观点,您的代码声明了_forMain,但没有实例化代码试图操作的对象的实例。mainform被实例化,但_formMain没有引用该实例。不需要实例化mainform的新实例,因为您已经有了一个实例。将该实例传递给另一个窗体的构造函数。不要创建第二个主窗体。将现有表单传递给另一个表单的构造器,如我的答案所述。请对有用的答案进行投票并标记答案!这是正确的感谢方式;-)