C# 使用泛型方法基于布尔值创建并显示表单实例

C# 使用泛型方法基于布尔值创建并显示表单实例,c#,winforms,c#-4.0,generic-method,C#,Winforms,C# 4.0,Generic Method,我有以下课程: internal partial class FBase : Form { public FBase() { InitializeComponent(); } public FBase(bool owner) : this() { if (!owner) { this.Opacity = 0; Load += (s, e) => Close(); } } } internal partial class Form1 : F

我有以下课程:

internal partial class FBase : Form
{
    public FBase() { InitializeComponent(); }

    public FBase(bool owner) : this()
    {
        if (!owner) { this.Opacity = 0; Load += (s, e) => Close(); }
    }
}

internal partial class Form1 : FBase
{
    public Form1(bool owner) : base(owner) { InitializeComponent(); }
}
此代码有效(不显示Form1):

但这不起作用(如表1所示):

这是OpenSingleMdiChild的实现:

public static void OpenSingleMdiChild<T>(this Form parent, Func<T> factory) where T : Form
{
    T f = null;

    foreach (Form c in parent.MdiChildren) if (c.GetType() == typeof(T)) {  f = c; break; }

    if (f == null) { f = factory(); f.MdiParent = parent; }

    f.Show(); f.Select();
}
public static void OpenSingleMdiChild(此表单父级,Func工厂),其中T:Form
{
tf=null;
foreach(parent.MdiChildren中的形式c)if(c.GetType()==typeof(T)){f=c;break;}
如果(f==null){f=factory();f.MdiParent=parent;}
f、 Show();f.选择();
}

如果我理解您的问题,您想知道为什么不显示Form1。我认为您的FBase构造函数是原因:

public FBase(bool owner) : this()
{
   if (!owner) { this.Opacity = 0; Load += (s, e) => Close(); }
}
在这里,您告诉加载事件
Close()表单。因此,如果所有者为false,它将直接关闭。此外,您应该在OpenSingleMdiChild方法中使用一些返回。因为正如@PeterBons所指出的,这真的很难理解

此外,我对这段代码不是很清楚:

using (Form1 f = new Form1(false))
{
    if(f != null) { f.MdiParent = parent; f.Show(); }
}
你展示了一个表单并直接销毁了它?为什么要有人这样做


我希望它能回答你的问题。或者问一些真正的问题;)

你不喜欢新台词,是吗?很难读懂。非常抱歉@PeterBons:)我只想关闭Form1,如果是所有者的话=false@Jalil那么请纠正你的问题。您可以这样写:OpenSingleMdiChild(()=>newform1(false));这可能不正确,但我想你的意思是:OpenSingleMdiChild(()=>newForm1(true));我的问题是OpenSingleMdiChild(()=>new Form1(false))没有关闭Form1!!!我刚刚用(…)@Jalil删除了。现在我明白你的问题了。我认为你的工厂找到了一种形式,因此你的工厂也找到了形式;从不调用,并显示创建的窗体。
public FBase(bool owner) : this()
{
   if (!owner) { this.Opacity = 0; Load += (s, e) => Close(); }
}
using (Form1 f = new Form1(false))
{
    if(f != null) { f.MdiParent = parent; f.Show(); }
}