将窗体声明为委托
本文关键字:声明 窗体 | 更新日期: 2023-09-27 17:49:21
我的程序中有4个表单:
- StartForm
- UIForm1
- UIForm2
- DebugForm
我用StartForm启动程序,然后用户可以使用按钮启动UIForm1和uiform2。还有另一个叫做DebugForm的表单,里面有一个文本框,我把使用UIForm1和2期间的所有错误都放在里面(异常等…)。
不,我想在StartForm中声明DebugForm,这样UIForm1和2都可以访问它。我该怎么做呢?我尝试将其声明为公共,但无法访问:
//in StartForm
public DebugForm dFrm = new DebugForm(); //Not working
//in UIForm1 or 2
//add a error to textbox
dFrm.textBox.Text += "ERROR NUMBER 1"; //Not working
dFrm.Show(); //Not working
我怀疑我必须用delegate关键字来做。怎样才能做到呢?
一个快速的解决方案是在StartForm中声明DebugForm变量为:
//in StartForm
public static DebugForm dFrm = new DebugForm();
并在其他形式中使用:
StartForm.dFrm.textBox.Text += "ERROR NUMBER 1";
StartForm.dFrm.Show();
要做到这一点,而不实际将StartForm暴露给UIForms1, 2,一个干净的方法是改变UIForm1和2的构造函数来采取行动。
private Action<string> _showDebugForm;
public UIForm1(Action<string> showDebugForm)
{
_showDebugForm = showDebugForm
}
和call
if(_showDebugForm!=null)
{
_showDebugForm("ERROR NUMBER 1");
}
在UIForm1 当你创建UIForm1和2的时候像这样做
new UIForm1(str =>
{
dFrm.textBox.Text += str;
dFrm.Show();
});
委托是一个方法的"指针",所以它代表了它被分配的函数或多个方法。它不能用来表示对象。
为什么不创建一个字符串对象(List)的集合,然后当你创建你的调试表单时,你可以在文本框中清空它。
在mainForm中创建集合并将其传递给ui2形式。当你创建DebugForm的时候,你可以把它传递到那里,做任何你喜欢的事情。
您可以在每个表单中创建一个属性,以便将此集合分配给该属性。
在StartForm
中声明一个公共属性,提供对DebugForm
的访问
public class MainForm
{
private DebugForm debugForm = new DebugForm();
public DebugForm DebugForm
{
get { return this.debugForm; }
}
}
则可以通过StartForm.DebugForm
访问DebugForm
startForm.DebugForm.Show();
startForm.DebugForm.TextBox.Text += "Error";