【问题标题】:Inherit from a 'Form' which has parameters从具有参数的“表单”继承
【发布时间】:2011-08-09 09:33:04
【问题描述】:

我有一个名为ScanFolder 的表单,我需要另一个表单,它需要与ScanFolder 非常相似,所以我决定使用form inheritance。但是对构造函数似乎有些误解。

ScanFolder 看起来像:

public partial class ScanFolder : Form
{
    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
    {
        //Doing something with parameters
    }
}

我尝试像这样继承Form

public partial class Arch2 : ScanFolder
{
}

但我收到警告 Constructor on type 'mhmm.ScanFolder' not found,并且Arch2 Form 编辑模式也有错误,我看到调用堆栈错误。

所以我尝试了这样的事情:

public partial class Arch2 : ScanFolder
{
    public Arch2(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
        : base(parent, autoModes, GMethodsClass)
    {
    }
}

但还是一样。

如您所见,我显然不知道自己在做什么。我想要实现的是让Arch2 看起来与ScanFolder 相同,所以我可以在设计器视图中看到它并覆盖一些方法或事件处理程序。

【问题讨论】:

  • 即使你得到这个工作,如果没有默认构造函数(即不接受任何参数的构造函数),你也无法在设计器中显示表单。
  • 所以如果我去掉所有的参数并在Form中找到任何其他方式使用它们,我将能够在设计视图中看到我继承的表单?
  • 您可以在 ScanFolder 中添加另一个方法来初始化参数 InitParams(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass) 并将构造函数留空以仅处理 GUI

标签: c# .net winforms inheritance constructor


【解决方案1】:

要使用表单设计器,您需要有一个无参数构造函数:

public partial class ScanFolder : Form
{
    public ScanFolder()
    {
         InitializeComponent(); // added by VS
    }

    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm)
       : this() // <-- important
    {
         // don't forget to call the parameterless ctor in each
         // of your ctor overloads
    }
}

或者,如果你真的需要一些初始化参数,你可以反过来做:

public partial class ScanFolder : Form
{
    public ScanFolder()
        : this(null, new bool[0], new GlobalMethods())
    {

    }

    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm)
    {
        InitializeComponent(); // added by VS
        // other stuff
    }
}

我推荐第一种方式,否则需要传递一些合理的默认参数(我不推荐传递空参数)。

似乎在某些情况下,您还必须在更改类后重新启动 Visual Studio。

【讨论】:

  • 对不起,“调用无参数构造函数”是什么意思?我是否需要在 ScanFolder 类中的每个覆盖的构造函数中使用 ScanFolder() ?那么继承类呢?它应该看起来像我在上面的帖子中的例子吗?
  • +1。这行得通。但是,我必须重新启动 Visual Studio 才能使设计器工作(来自我没有无参数构造函数的状态) - 重建解决方案等. 还不够。也许这些信息可以添加到答案中。
【解决方案2】:

您可以在父表单中使用此代码:

public partial class ScanFolder : Form
{
 public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
  {
    //doing something with parameters
  }
}

然后以子形式为:

public partial class ScanFolder : Form
{
  public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
     : base(parent,autoModes,GMethodsClass)
  {
    //doing something with parameters
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多