子窗体和父窗体问题!! 现在有一个父窗体mainfrm,点击父窗体mainfrm菜单弹出子窗体childfrm。怎么才能实现:随便你点多少次父窗体mainfrm菜单,始终只弹出一个子窗体childfrm啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Form2 frmF = null; private void button2_Click(object sender, EventArgs e) { if (frmF == null || frmF.IsDisposed) { frmF = new Form2(); frmF.Show(); } else { frmF.Activate(); } } 其实这个问题,就是经典的23种设计模式中的单件模式(singleton),下面用c#实现之: 首先我们有2个windows form,主窗体叫form1,子窗体叫childform。在主窗体中加入一menu,用来实例化子窗体,我们在form1.cs中写入下代码: private static childform childform; //静态变量,保存唯一实例 private void menuitem2_click(object sender, system.eventargs e) { childform childform = getchildform(); //获取子窗体对象 childform.show(); //显示之 } private childform getchildform() { //先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了 if( childform == null || childform.isdisposed ) { //第一次实例化也好,被关了也好,都重新实例化 childform = new childform(); childform.mdiparent = this; } return childform; } Form2 frmF = null; private void button2_Click(object sender, EventArgs e) { if (frmF == null || frmF.IsDisposed) { frmF = new Form2(); frmF.Show(); } else { frmF.Activate(); } } 楼上正解阿 来晚了 留个名 我建议楼主看看WebCast上的东东,那里有个例子基本和楼主问的问题一样 yumanqing(每天进步一点点)正解 刚才打字太慢了 呵呵 楼上已有答案..只需做个判断就行...if( childform == null || childform.isdisposed ) 以前我也用public static这种方法,后来觉得不好,占内存,也不符合编码规范,就换了种思路来实现。2005下使用: /// <summary> /// 查找是否已创建窗体 /// </summary> /// <param name="FormName">窗体Name</param> /// <returns></returns> public static bool SearchAllForm(string FormName) { for (int i = 0; i < Application.OpenForms.Count; i++) { if (Application.OpenForms[i].Name == FormName) { return true; } } return false; }2003下使用: [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")] //找子窗体 private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "SendMessage")] //用于发送信息给窗体 private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); /// <summary> /// 查找是否已创建窗体 /// </summary> /// <param name="FormTitle">标题名称</param> /// <returns></returns> public static bool SearchForm(string FormTitle) { IntPtr ParenthWnd = new IntPtr(0); IntPtr EdithWnd = new IntPtr(0); //查到窗体,得到整个窗体 ParenthWnd = FindWindow(null,FormTitle); if (!ParenthWnd.Equals(IntPtr.Zero)) { return true; } else { return false; } } Form1 childfrm = null; foreach (Form f in this.MdiChildren) { if (f is Form1) { childfrm = (Form1)f; break; } } if (childfrm != null) { childfrm.Show(); childfrm.Focus(); } else { childfrm = new Form1(); childfrm.MdiParent = this; childfrm.Show(); childfrm.Focus(); } //在你的主form class里面增加下面这个函数,传入要激活或要新创建的子窗体private CheckChildFrmExists(string ChildName){ foreach(Form newFrm in this.MdiChildren) { if(childFrm.Name == childFrmName) { if(childFrm.WindowState == FormWindowState.Minimized) childFrm.WindowState = FormWindowState.Normal; childFrm.Activate(); return true; } }}//最后在调用子窗体的代码里面增加调用上面的函数的代码,如下if (this.checkChildFrmExist("WareDataManage") == true) { return; } WareDataManage newFrm = new WareDataManage(true); newFrm.MdiParent = this; newFrm.Show(); 用单例模式private static childform childform; //静态变量,保存唯一实例 private void menuitem2_click(object sender, system.eventargs e) { childform childform = getchildform(); //获取子窗体对象 childform.show(); //显示之 } private childform getchildform() { //先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了 if( childform == null || childform.isdisposed ) { //第一次实例化也好,被关了也好,都重新实例化 childform = new childform(); childform.mdiparent = this; } return childform; } Dictionary<int,int>怎么排序? 怎样求出鼠标在richTextBox1上的位置? 有没有详细讲解C#中内存管理,垃圾回收的文章?堆,托管堆,堆栈。。。 数组的问题(在线等)谢谢 一个值得探讨的问题 如何在DATAGRID中显示TREEVIEW的功能 有关注册表的问题 vs.net如何升级? 求助C#打印问题 请教。net高手! 时间格式中分的m被识别成月的M该怎么办? 新手转型问题,答了就给分了哈
Form2 frmF = null;
private void button2_Click(object sender, EventArgs e)
{
if (frmF == null || frmF.IsDisposed)
{
frmF = new Form2();
frmF.Show();
}
else
{
frmF.Activate();
}
}
{
childform childform = getchildform(); //获取子窗体对象
childform.show(); //显示之
} private childform getchildform()
{
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
if( childform == null || childform.isdisposed )
{ //第一次实例化也好,被关了也好,都重新实例化
childform = new childform();
childform.mdiparent = this;
} return childform;
}
private void button2_Click(object sender, EventArgs e)
{
if (frmF == null || frmF.IsDisposed)
{
frmF = new Form2();
frmF.Show();
}
else
{
frmF.Activate();
}
}
if( childform == null || childform.isdisposed )
2005下使用:
/// <summary>
/// 查找是否已创建窗体
/// </summary>
/// <param name="FormName">窗体Name</param>
/// <returns></returns>
public static bool SearchAllForm(string FormName)
{
for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name == FormName)
{
return true;
}
}
return false;
}
2003下使用: [DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")] //找子窗体
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "SendMessage")] //用于发送信息给窗体
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
/// <summary>
/// 查找是否已创建窗体
/// </summary>
/// <param name="FormTitle">标题名称</param>
/// <returns></returns>
public static bool SearchForm(string FormTitle)
{
IntPtr ParenthWnd = new IntPtr(0);
IntPtr EdithWnd = new IntPtr(0); //查到窗体,得到整个窗体
ParenthWnd = FindWindow(null,FormTitle);
if (!ParenthWnd.Equals(IntPtr.Zero))
{
return true;
}
else
{
return false;
} }
foreach (Form f in this.MdiChildren)
{
if (f is Form1)
{
childfrm = (Form1)f;
break;
}
}
if (childfrm != null)
{
childfrm.Show();
childfrm.Focus();
}
else
{
childfrm = new Form1();
childfrm.MdiParent = this;
childfrm.Show();
childfrm.Focus();
}
private CheckChildFrmExists(string ChildName)
{
foreach(Form newFrm in this.MdiChildren)
{
if(childFrm.Name == childFrmName)
{
if(childFrm.WindowState == FormWindowState.Minimized)
childFrm.WindowState = FormWindowState.Normal;
childFrm.Activate();
return true;
}
}
}
//最后在调用子窗体的代码里面增加调用上面的函数的代码,如下
if (this.checkChildFrmExist("WareDataManage") == true)
{
return;
}
WareDataManage newFrm = new WareDataManage(true);
newFrm.MdiParent = this;
newFrm.Show();
private static childform childform; //静态变量,保存唯一实例 private void menuitem2_click(object sender, system.eventargs e)
{
childform childform = getchildform(); //获取子窗体对象
childform.show(); //显示之
} private childform getchildform()
{
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
if( childform == null || childform.isdisposed )
{ //第一次实例化也好,被关了也好,都重新实例化
childform = new childform();
childform.mdiparent = this;
} return childform;
}