将窗体声明为委托

本文关键字:声明 窗体 | 更新日期: 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";