如题
private void toolStripLabel1_Click(object sender, EventArgs e)
{
//怎么先判断类TestForm1的实例是否已经存在,如果已经存在,就直接显示,如果不存在,就先建立再显示?
TestForm1 testF = new TestForm1(this);
testF.Show();
}
private void toolStripLabel1_Click(object sender, EventArgs e)
{
//怎么先判断类TestForm1的实例是否已经存在,如果已经存在,就直接显示,如果不存在,就先建立再显示?
TestForm1 testF = new TestForm1(this);
testF.Show();
}
第二次显示时先判断是否存在该实例,
有的话直接显示,没有话回到第一次新建窗口
/// <summary>
/// 显示窗口
/// </summary>
/// <param name="isCodeWindow"></param>
void OnShowWindow( bool isCodeWindow ) {
if( this.tstringTreeView.SelectedNode != null && this.tstringTreeView.SelectedNode.Tag is EntityBase ) {
this.Cursor = Cursors.WaitCursor;
EntityBase entityBase = this.tstringTreeView.SelectedNode.Tag as EntityBase;
FrmTemplateEditor frmEditor; //先判断是否已打开该页面,有的话,直接显示之
foreach( var item in this.FrmTstring.TstringEditor.TstringDock.Documents ) {
if( item is FrmTemplateEditor ) {
frmEditor = item as FrmTemplateEditor;
if( frmEditor.TstringGuid == entityBase.Guid ) {
frmEditor.IsCodeWindow = isCodeWindow;
frmEditor.Show( this.FrmTstring.TstringEditor.TstringDock );
this.Cursor = Cursors.Default;
return;
}
}
} //第一次打开该表的设计窗口时,新建窗口并显示
frmEditor = new FrmTemplateEditor( entityBase, this.tstringTreeView.SelectedNode, isCodeWindow );
frmEditor.Tag = this.FrmTstring;
frmEditor.Show( this.FrmTstring.TstringEditor.TstringDock );
this.Cursor = Cursors.Default;
}
}
二楼的还是不太明白啊,OnShowWindow( bool isCodeWindow )该用在哪个地方?
{
if(testf==null || testf.disposed)
{
TestForm1 testF = new TestForm1();
testF.Show();
}
else
{
testf.actived();
}
}
这样就OK!
在创建窗体时判断静态变量是否为null,
如果为空,则建立并显示,
不为空,则直接显示。
private void toolStripButton3_Click(object sender, EventArgs e)
{
if (testF == null)
{
testF = new TestForm1(this);
testF.Show();
}
else
{
testF.Show();
} }以上的代码,有问题,就是如果把已经建立的窗口关了,那么在点击button3时,就不再建立并显示了,高手帮看看啊
OnShowWindow( bool isCodeWindow )这个是自己定义的方法,本与你的问题无关的就没写出来
参考代码啊,只是说明了思路大概意思是
首次加载时新建窗口并保存到列表里(这样的做的好处是可以放多个窗口实例)
再次加载时先判断列表中有没有该窗口,有直接显示,没有回到首次逻辑,就这样
基本就是
public class TestForm1 :FROM
{
static TestForm1 form1 ;
private TestForm1() //private 构造函数
{
}
public TestForm1 CreateTestFrom1()
{
if (form1 != null )
{
return form1 ;
}
else
return new TestForm1();
}
public void TestForm1_Closed() //在窗体CLOSED里面把form1 给赋 null ;
{
form1 = null ;
}
}
然后使用窗体时 TestForm1 testf = TestForm1.CreateTestForm1();
可以遍历所有窗体控件,判断其 type 是否是TestForm1 , 如果是就直接 显示,这样做的问题是,如果你多个窗体实例显示那个好呢.; “,
我这么做当然是保证他只有一个实例了,如果有多个,就随便显示一个也无妨。
我想的就是遍历所有窗体,然后判断窗体的类,可是不知道怎么写那些代码,我的C#不熟练啊,请高手指导
foreach (Form f in this.MdiChildren)
{
if (f is TestForm1 ) // 此处判断类型是TestForm1
{
f.Text = " i love football";
f.Show();
break ;
}
}如果遍历子控件的话,用foreach (control c in this.controls)
{
//此处处理代码.
}
这个C#里自己会判断的。
上面楼上几种方法楼主都可以。
思路也很清析了。思路:在窗口容器里对已打开的所有子窗体进行name属性判断是否是当前正要打开的子窗体,是:激活,使它获得焦点,并最大化,
否:实例化打开
这个C#里自己会判断的。
刚测试过!
private bool checkChildFrmExist(string childFrmName)
{
foreach (Form childFrm in this.MdiChildren)
{
if (childFrm.Name == childFrmName) //用子窗体的Name进行判断是否已实例化,如果存在则将他激活
{
if (childFrm.WindowState == FormWindowState.Minimized)
childFrm.WindowState = FormWindowState.Normal;
childFrm.Activate();
return true;
}
}
return false;
} 以下是按钮调用
private void bottom1_Click(object sender, EventArgs e)
{
drag.form1subform = new drag.form1();
if (!checkChildFrmExist(subform.Name.ToString()))
{
subform.MdiParent = this;
subform.Show();
}
}
{
int a = 0;
static List <MyForm> formList = new List <MyForm>();
string msn_id = null;//写成属性吧,懒得写了.
private MyForm(string id)
{
msn_id = id; }
public static MyForm GetFormById(string id)
{
foreach (MyForm my in formList)
{
if (my.msn_id == id)
return my;
}
MyForm newForm = new MyForm(id);
formList.Add(newForm);
return newForm;
}