C# 从另一个表单访问后台工作人员';s按钮单击事件
我在c#上慢慢地,但肯定会在代码中lol: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
// 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的新实例,因为您已经有了一个实例。将该实例传递给另一个窗体的构造函数。不要创建第二个主窗体。将现有表单传递给另一个表单的构造器,如我的答案所述。请对有用的答案进行投票并标记答案!这是正确的感谢方式;-)