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(); }
}