C#中的多个子窗体和父窗体

3
我有6个表单(假设为F1,F2,F2a,F2b,F2c和F2d)。
我想把F2a到F2d作为F2的子表单,而F2的父表单是F1,F1的子表单是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上,它给了我两个错误:

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

2.参数1:无法将'GUI_X.F2'转换为'System.Windows.Forms.MainMenu'

那么为什么它对于F1F2有效,而对于F2aF2d无效?我放错了什么吗?我该如何解决这个问题?

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

如果这有所帮助,我正在使用Windows Form项目。

提前感谢您的帮助。

编辑

对不起,我忘记在F2 *中初始化oF,感谢@S_I_R的答案。但仍然无法解决问题。


看起来是类型不匹配。this.oF 需要是一个 base System.Windows.Form 或自定义的基础类型吗? - Cam Bruce
你能把所有的类定义都包含在你的问题中吗?例如 public class F2 : baseclass - Sayse
@sayseF1 public partial class F1 : Form,F2 public partial class F2 : Form,F2a - F2d与F2相同,后跟它们的字母。 - Tommy Aria Pradana
1
好的,这两个错误的意思是F2A构造函数期望一个MainMenu作为参数,我猜测你有第二个构造函数,例如public F2A(MainMenu mm),它认为你正在尝试使用它。你可以尝试重新组织你的构造函数,使表单构造函数在菜单之前,然后选择清理解决方案,接着再编译解决方案,或许会成功。 - Sayse
之前有一件事我没有意识到,我发现VS可以创建存根构造函数(虽然我还不知道这是什么),并且解决了我的问题。感谢大家的帮助,我对C#和VS都非常新手。 - Tommy Aria Pradana
没关系,我们都还在学习中 :) - Sayse
3个回答

2

请确认将this.oF作为F2类中的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();
}

F2public F1 oF, 在 F2a - F2dpublic F2 oF, 我认为这没有问题。我的问题是如何使 F2a 到 F2d 成为表单 F2 的子级,而 F1 是 F2 的父级,这样我就可以从 F2 调用 F2a、F2b 等。 - Tommy Aria Pradana

0

你现有的代码应该长这样:

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有问题? - Tommy Aria Pradana
抱歉,应该是ShowDialog。我已经编辑答案以匹配。 - simon at rcl

0
你把表单的一部分 F2 放到了 System.Windows.Forms 命名空间中,这样做是不正确的。请将表单的所有部分都放在自己的命名空间 (GUI_X) 中。检查所有包含 partial class F2 的文件,并确保命名空间是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接