从其他表单的按钮点击事件

时间:2015-04-26 16:19:41

标签: c#

我慢慢地绕着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)

所以我在这种情况下并没有真正获得访问权限吗?

4 个答案:

答案 0 :(得分:0)

_formMain = Application.OpenForms [“formMain”]; 单击按钮添加此代码并尝试。

答案 1 :(得分:0)

_formMain访问anotherForm时:

我假设anotherForm已实例化并从_formMain调用,如下所示:

anotherForm _anotherForm = new anotherForm();
_anotherForm.Show();

现在有几种方法可以从_formMain访问_anotherForm,但我认为最简单的方法是将_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
    }
}

但要小心......将BackgroundWorker放在_formMain中需要您可以拨打公开方法并返回BackgroundWorker

希望这有帮助!

答案 2 :(得分:0)

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

anotherForm _anotherForm = new anotherForm(this);
_anotherForm.Show();

假设您要从mainform中的代码创建另一个表单,this实际上是指主表单。 在另一个的构造函数中执行此操作:

public anotherForm(MainForm formMain){
    _formMain = formMain;
}

这是解决此问题的最优雅方式。因为它清楚地表明从一种形式到另一种形式存在依赖性并使设计意图明确。

使用父级也没关系,但前提是主窗体实际上是另一种形式的父级。

通过Application对象可以工作,但是应用程序对象是全局的,你可以用这种方式隐藏你的依赖。

答案 3 :(得分:0)

感谢帮助人员:)

我现在有:

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

欢呼人们

格雷厄姆