【问题标题】:Multiple child and parent form in C#C# 中的多个子窗体和父窗体
【发布时间】:2014-04-22 16:36:04
【问题描述】:

我有 6 种形式(比如说 F1、F2、F2a、F2b、F2c、F2d)

我正在尝试将 F2a - F2d 作为 F2 的子级,而 F2 的父级是 F1F1 子窗体是 F2

我试过的

F1

private void button1_Click(object sender, EventArgs e)
{
     F2 nX = new F2(this);

     this.Visible = false;

     nX.Visible = true;
}

F2

public F2(F1 parentForm)
{
    InitializeComponent();

    this.oF = parentForm;

    F2a nA = new F2a(this); //It give me error as i will describe down there.
}

public F1 oF;

F2a - F2d

    public F2* (F2 parentForm) //Well lets just say * stand for the letter of each Form
    {
        InitializeComponent();

        this.oF = parentForm;
    }
    public F2 oF;

F2 上它给了我 2 个错误

1.'GUI_X.F2a.F2a(System.Windows.Forms.F2)'的最佳重载方法匹配有一些无效参数

2.Argument 1:无法从 'GUI_X.F2' 转换为 'System.Windows.Forms.MainMenu'

那么为什么它不适用于 F2F2a - F2d 而它适用于 F1F2 ? 我放错东西了吗?我该如何解决这个问题?

我是 C# 新手,如果有人能帮助我并尽可能简单地解释它,我将不胜感激。

如果这有助于我使用 Windows 窗体 项目。

提前谢谢你。

编辑

对不起,我忘记在 F2* 中初始化 oF,感谢@S_I_R 的回答。 但是还是解决不了问题

【问题讨论】:

  • 看起来类型不匹配。 this.oF 需要是 base System.Windows.Form 还是自定义基类型?
  • 你能把所有的类定义都包含在你的问题中吗?即public class F2 : baseclass
  • @sayse F1 public partial class F1 : Form ,F2 public partial class F2 : Form ,F2a - F2d 与 F2 相同信
  • 这两个错误的意思是 F2A 构造函数需要 MainMenu 作为参数,我假设您有第二个构造函数,例如 public F2A(MainMenu mm) 并且它认为您是尝试使用它,您可能会在重组构造函数方面取得成功,以便表单构造函数首先是菜单之一,然后选择干净的解决方案,然后是构建解决方案
  • 嗯,有一点我以前没有意识到,我发现 VS 可以制作存根构造函数(虽然我仍然不知道)并且它解决了我的问题。感谢大家的帮助,我最终是 C# 和 VS 的新手。

标签: c# winforms forms parent-child


【解决方案1】:

请您在 F2* 类中验证 this.oF 的类型是否为 F2

public F2* (F2 parentForm) 
{
    InitializeComponent();

    this.oF = parentForm;
}
private F2 oF; //Make sure this is F2 not F1 or other

编辑:

只需在 F2 类中声明 F2a-F2d 私有对象,然后在需要时显示它们

public class F2
{
  private F2a f2a;
  private F2b f2b;
  public F1 oF; 
  public F2(F1 parent)
  {
    InitializeComponent();
    this.oF = parent;
    f2a = new F2a(this);
    f2b = new F2b(this);
  }

// Now you call F2a - F2d from any method
public void ShowF2a()
{ 
  f2a.ShowDialog();
}

【讨论】:

  • F2 public F1 oF 上,在 F2a - F2d public F2 oF 上,我认为这没有问题。我的问题是我如何可以使 F2a 到 F2d 成为 Form F2 的子代,而 F1 是 F2 的父代,所以我可以从 F2 调用 F2a、F2b 等
【解决方案2】:

您已将表单的一部分F2 放入System.Windows.Forms 命名空间。不要这样做。将表单的所有部分放入您自己的命名空间 (GUI_X)。检查所有包含partial class F2 的文件并确保命名空间正确。

【讨论】:

    【解决方案3】:

    你现有的代码应该看起来像 gthis:

    private void button1_Click(object sender, EventArgs e)
    {
         F2 nX = new F2(this);
         nX.Show();
    }
    

    ..但是再做一次改变,你就会得到你想要的:

    private void button1_Click(object sender, EventArgs e)
    {
         F2 nX = new F2(this);
         nX.ShowDialog();
    }
    

    您需要在表单实例上调用 Show 以使其显示。但是,如果您调用 ShowModal,它不会让您回到“父级”,直到您关闭子级。

    【讨论】:

    • 当我将 Visible 更改为 ShowModal 时,它给了我一个错误,提示 ShowModal 没有引用我应该添加引用或我的 VS 有问题?
    • 道歉 - 应该是 ShowDialog。我已经编辑了答案以匹配。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2014-12-16
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多