调用窗体问题 在一个mainform中有两个按钮,并且是一个多文档窗体,在这个mainform窗体中有两个childrenform窗体,当按button1时调用一个childrenform1窗体,当按button2时,调用另一个childrenform2窗体;两个不同的窗体可以同时存在,但是相同的窗体只能是一个,该怎样用代码写这个程序???? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 窗体有一个活动Activate()方法,但是要判断当前有没有打开同样的窗体,还要能够循环调用…… 以下是我的做法:有两个窗体一个form1和form2再是form1中的代码,也就是主窗体的代码,点击按钮事件在这里 public Form2 form2 = null; private void button1_Click(object sender, EventArgs e) { if (form2 == null) { form2 = new Form2(this); form2.Show(); } else { form2.Focus(); } }在form2中的代码如下 Form1 form1 = null; public Form2(Form1 form) { InitializeComponent(); form1 = form; } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { if (form1 != null) { form1.form2 = null; } }就这个样子就可以实现了,我实现了!不过我总觉得这样搞怪怪的!希望高人解决 你想的是"同一个窗体,永远只能打开一个"吧? 这个简单,用单对象模式就行了.方法是把Form的构造方法改成 private,然后公开一个CreateForm的方法,在该方法中返回唯一的窗体. 以下伪代码仅供示意:public partial class Form2 : Form { static Form2 frmOnlyForm;//静态的 private Form2()//私有的构造器 { InitializeComponent(); } //利用此静态方法创建唯一窗体,如果窗体已经new了,就返回该窗体,否则重新创建一个. public static Form CreateForm() { if (frmOnlyForm == null) { frmOnlyForm = new Form2(); } return frmOnlyForm; } //遍历主窗口上的所有子菜单 for (int i = 0; i < this.MdiChildren.Length; i++) { //如果所点的窗口被打开则重新激活 if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower()) { this.MdiChildren[i].BringToFront(); //this.MdiChildren[i].Show(); if (this.MdiChildren[i].WindowState == FormWindowState.Maximized) { // this.MdiChildren[i].WindowState = FormWindowState.Maximized; } flag = true; break; } } if (!flag) { //如果不存在则用反射创建form窗体实例。 Assembly asm = Assembly.Load("MasterDB");//程序集名 object frmObj = asm.CreateInstance("MasterDB." + formName);//程序集+form的类名。 窗体只是一个对象,任何时候,只有一个对象存在,第一次调用 CreateForm()方法的时候,肯定会new 窗体, 以后都是直接返回之前创建的窗体对象. ....直到把窗体关闭,引用消失. 单击按钮调用的时候:什么不管,直接写:(示意伪代码)private void btnOpenForm2(objcet sender,EventArgs e){ Form2 = Form2.CreateForm(); From2.ShowDialog();} 你的意思是不是不可以出现两个form1或者两个form2,但是可以同时出现一个form1和一个form2 不是,只能出现一个form1或者是一个form2,也可以是form1和form2同时存在也就是说,如果是同样的窗体的话只能出现一个,而不同的窗体可以同时出现…… public Form1 Form1 = new Form1();public Form2 Form2 = new Form2();private void button1_Click(object sender, EventArgs e){ if (!Form1.IsHandleCreated) { Form1.Show(); }}private void button2_Click(object sender, EventArgs e){ if (!Form2.IsHandleCreated) { Form2.Show(); }} 这样就好了,还可以解决你窗体关闭后重新打开的问题。代码只表示大致的思想。public Form1 form1;private void button1_Click(object sender, EventArgs e){ if ( form1 == null || form1.IsDisposed ) { form1 = new Form1 (); } form1.Show();}Form2 同上。 查询一年内的记录 RichTextBox 中实现段落对齐及其缩进问题 c# 点击关闭按钮,做一些事情 怎么去读取datagridview每行的数据???? 写什么软件可以赚点零用钱 请问酒店系统里面的坐标房态图是怎么做出来的?分不够再加。。 从数据库读取出的二进制数据不为空,但是都为0 求论坛的详细设计书 如何将datagrid中的数据转到dataset中? 这条语句如何写成c#? 帮忙写一个类文件 请教一个关于图像动态显示的问题
有两个窗体一个form1和form2
再是form1中的代码,也就是主窗体的代码,点击按钮事件在这里 public Form2 form2 = null;
private void button1_Click(object sender, EventArgs e)
{
if (form2 == null)
{
form2 = new Form2(this);
form2.Show();
}
else
{
form2.Focus();
}
}
在form2中的代码如下 Form1 form1 = null;
public Form2(Form1 form)
{
InitializeComponent();
form1 = form;
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (form1 != null)
{
form1.form2 = null;
}
}就这个样子就可以实现了,我实现了!不过我总觉得这样搞怪怪的!希望高人解决
这个简单,用单对象模式就行了.方法是把Form的构造方法改成 private,然后公开一个CreateForm的方法,在该方法中返回唯一的窗体. 以下伪代码仅供示意:
public partial class Form2 : Form
{
static Form2 frmOnlyForm;//静态的
private Form2()//私有的构造器
{
InitializeComponent();
} //利用此静态方法创建唯一窗体,如果窗体已经new了,就返回该窗体,否则重新创建一个.
public static Form CreateForm() {
if (frmOnlyForm == null) {
frmOnlyForm = new Form2();
}
return frmOnlyForm;
}
for (int i = 0; i < this.MdiChildren.Length; i++)
{
//如果所点的窗口被打开则重新激活
if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
{
this.MdiChildren[i].BringToFront();
//this.MdiChildren[i].Show();
if (this.MdiChildren[i].WindowState == FormWindowState.Maximized)
{
// this.MdiChildren[i].WindowState = FormWindowState.Maximized;
}
flag = true;
break;
}
}
if (!flag)
{
//如果不存在则用反射创建form窗体实例。
Assembly asm = Assembly.Load("MasterDB");//程序集名
object frmObj = asm.CreateInstance("MasterDB." + formName);//程序集+form的类名。
第一次调用 CreateForm()方法的时候,肯定会new 窗体, 以后都是直接返回之前创建的窗体对象.
....直到把窗体关闭,引用消失.
什么不管,直接写:(示意伪代码)
private void btnOpenForm2(objcet sender,EventArgs e)
{
Form2 = Form2.CreateForm();
From2.ShowDialog();
}
也就是说,如果是同样的窗体的话只能出现一个,而不同的窗体可以同时出现……
public Form2 Form2 = new Form2();
private void button1_Click(object sender, EventArgs e)
{
if (!Form1.IsHandleCreated)
{
Form1.Show();
}
}
private void button2_Click(object sender, EventArgs e)
{
if (!Form2.IsHandleCreated)
{
Form2.Show();
}
}
这样就好了,还可以解决你窗体关闭后重新打开的问题。代码只表示大致的思想。public Form1 form1;private void button1_Click(object sender, EventArgs e)
{
if ( form1 == null || form1.IsDisposed )
{
form1 = new Form1 ();
} form1.Show();
}Form2 同上。