我慢慢地绕着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)
所以我在这种情况下并没有真正获得访问权限吗?
答案 0 :(得分:0)
答案 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部分中,或者我应该打开一个新问题? :)
欢呼人们格雷厄姆