例如:
有两个form,分别为form1和form2,在form1种有个Button1,在Button1中的点击事件中,打开form2
private void Button1_Click()
{
form2 f = new form2();
f.Show();
}
在以上的代码中form2是同时可以打开多个的。我的问题是:在Button1的点击事件是否能够判断:当form2已经有一个实例打开时,就不再打开新的form2;如果还没有form2的实例打开,则打开一个form2。如果是子窗口的模式,是可以通过以下代码判断出某个子窗体是否已经打开:
form2 f = new form2();
foreach(Form key in this.MdiChildren)
{
if(key.Name.ToUpper() == f.Name.ToUpper())
{
return;
}
}
f.Show();但对于非子窗口的form不知怎么判断是否已经打开?
有两个form,分别为form1和form2,在form1种有个Button1,在Button1中的点击事件中,打开form2
private void Button1_Click()
{
form2 f = new form2();
f.Show();
}
在以上的代码中form2是同时可以打开多个的。我的问题是:在Button1的点击事件是否能够判断:当form2已经有一个实例打开时,就不再打开新的form2;如果还没有form2的实例打开,则打开一个form2。如果是子窗口的模式,是可以通过以下代码判断出某个子窗体是否已经打开:
form2 f = new form2();
foreach(Form key in this.MdiChildren)
{
if(key.Name.ToUpper() == f.Name.ToUpper())
{
return;
}
}
f.Show();但对于非子窗口的form不知怎么判断是否已经打开?
解决方案 »
- DATAGRIDVIEW 绑定到文件对象,编辑文件对象中的LIST<> 的设计问题
- 求解(谁能帮我解决这些问题分全给你了!!!谢谢)
- 如何在批量更新大数据时显示更新的进度。
- 这个错误怎么办?
- 水晶报表分页和子报表的参数问题
- 用TextBox往数据库添加数据 DataGrid显示出来的问题(数据添加进去显示不出来 郁闷)谁帮看一下(附代码)
- 初级问题,请大家解答!感谢!
- 同胞们,微软的Microsoft .NET Framework 3.5 发布了...快去累吧!!!
- C#中的换行符是什么?
- 请教--怎样写批处理文件来实现去网上自动下载文件?
- 如何判断查询的数据集为空?
- 怎么从数据库中读出数据,在线等
private void button1_Click(object sender, System.EventArgs e) {
if (f==null || f.IsDisposed ) {
f=new Form2();
}
f.Show();
}
public string strHe=null;
private void He_Load(object sender, System.EventArgs e)
{
strHe=this.Handle.ToString();
}
Form1:
private string GetStrHe=null;
Form2 frm=new Form2();
//GetStrHe=Form2.strHe;
if(GetStrHe==null)
{
frm.Show();
GetStrHe=Form2.strHe;
}
else
{
MessageBox.Show("窗体已打开");
}
[DllImport("user32.dll", EntryPoint="FindWindow")]
public static extern int FindWindow (
string lpClassName,
string lpWindowName
);
lpClassName ---- String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类 lpWindowName --- String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
问个问题啊,你这是不是API的反射调用
相比之下 用哪一个好呢
相对来说 哪一个会效率高一点呢
是别的程序开得用dazhu2(边城浪子【倚天不出,谁与争锋】) 的办法;
另外如果是托管的窗口,探测程序也是托管的,不要用api,封送效率很低。
{
public static int m_Static_InstanceCount=0;
}调用与判断的代码是:
public class Form1
{
private void functionName()
{
//在此n值由用户决定这个窗体类实例的个数
//判断Form2类实例的个数
if(Form2.m_Static_InstanceCount <n)
{
Form2 frm=new Form2();
//实例加一
Form2.m_Static_InstanceCount++;
//show出来
frm.Show();
}
}
}======
我觉得这样的好一些,不用在两个类都写那么多烦人松散的代码了。
在form2的dispost事件中把static变量一关闭就清空。
这样可以做到只实例化一次或几次form2
以前在项目中做过,你可以试下!!!!
整理后的代码如下:public class Form2
{
public static int m_Static_InstanceCount=0;
public Form2()
{
Form2.m_Static_InstanceCount++;
}
protected override void Dispose( bool disposing )
{
//其它代码
Form2.m_Static_InstanceCount--;
}
}
public class Form1
{
private void functionName()
{
//在此n值由用户决定这个窗体类实例的个数
//判断Form2类实例的个数
if(Form2.m_Static_InstanceCount <n)
{
Form2 frm=new Form2();
//show出来
frm.Show();
}
}
}
[DllImport("user32.dll", EntryPoint="FindWindow")]
public static extern int FindWindow (
string lpClassName,
string lpWindowName
);
而不能采用与form2之间传递互调用的方法。但FindWindow是怎么用的?
我如下这样使用无效:
form2 f = new form2();
int i = FindWindow(f.Name, f.text);
if (i == 0)
{
f.Show();
}
else
{ return;
}//以上FindWindow的两个参数不知道该传入什么值?
if(form2.showDialog(this) == DialogResult.OK)
{
}
form2.Dispose();
int i = FindWindow(null, f.text);//把lpClassName参数设为空值
这样是可以达到我预想的效果,
但把同样的代码移植到另一个我正式需要运用的程序里却不能达到我想要的效果。
而且第一次打开时返回值都为非0值。
还有一个疑惑:即使以上的代码可以,但f.text的值可能是非唯一值,可能也会导致问题。到底该怎么办?
我的天啊?我这么短的代码,还复杂?天地良心啊?
MessageBox.Show(" 有这个窗体!!");
else
MessageBox.Show(" 没有这个窗体!!");
我在前面已经写过,使用了FindWindow(null, form.Text)的方法,在我的正式环境中并不能达到我预想的效果,而且这样使用还有一个问题就是,form的标题信息的可以重复的,这样也将导致出现问题。此问题,再等一天,如果还没有高手来提出更好的解决方法,就要结贴了!
frm.ShowDialog();
1、在Form1中定义两个Hashtable变量:
System.Collections.Hashtable hashTable1;
System.Collections.Hashtable hashTable2;2、在Form1的Load事件中初始化以上两个变量:
hashTable1 = new Hashtable();
hashTable2 = new Hashtable();3、ShowForm方法:
private void ShowForm(object sender, Form oForm)
{
Form frmToInvoke;
string key;
key = sender.GetHashCode().ToString() + "-" + oForm.GetType().ToString();
if (hashTable1[key] == null)
{
frmToInvoke = oForm;
frmToInvoke.Closing += new CancelEventHandler(this.Form_Closing);
if (bIsMdiChildren)
{
frmToInvoke.MdiParent = this;
}
hashTable1.Add(key, frmToInvoke);
hashTable2.Add(oForm.GetHashCode(), key);
}
else
{
frmToInvoke = (System.Windows.Forms.Form)hashTable1[key];
}
frmToInvoke.Show();
frmToInvoke.Activate();
}4、在Form1中增加如下事件(在Form2关闭时驱动发生):
private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
hashTable1.Remove(hashTable2[sender.GetHashCode()]);
hashTable2.Remove(sender.GetHashCode());
}5、在Form1中驱动打开Form2的代码中写如下调用ShowForm(这里为button事件):
private void button1_Click(object sender, System.EventArgs e)
{
ShowForm(sender, new FrmCreateNew());
}
private void ShowForm(object sender, Form oForm, bool bIsMdiChildren)
//sender:
//oForm: 需要打开的Form
//bIsMdiChildren:打开的oForm是否为子窗口模式打开。