关于Winform程序窗体间的跳转问题:
对于编程新手来讲,winform程序窗体间的跳转,经常会出现一些异常,或是弹出重复的窗口,如下图
下面给出一种方法,可以很好的避免掉这样的问题:
首先,在主程序Program中,定义一个“找窗体或是创建窗体”的方法,见以下代码:
namespace FormJump
{
static class Program
{
public static List<Form> formList = new List<Form>();
/// <summary>
/// 找窗体或创建窗体的方法
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
internal static Form FindOrCreateFrom(Type type)
{
Form form = null;
foreach (Form formItem in Program.formList)
{
if (formItem.GetType() == type)
{
form = formItem;
form.Activate();
break;
}
}
if (form == null)
{
object obj = Activator.CreateInstance(type);
if (obj is Form)
{
form = obj as Form;
form.Show();
}
}
return form;
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMain());
}
}
}
然后添加一个FrmChild的子窗体,编写一个加载和关闭窗体的方法,见以下代码:
namespace FormJump
{
public partial class FrmChild : Form
{
public FrmChild()
{
this.Load += new EventHandler(FrmChild_Load);
this.FormClosed += new FormClosedEventHandler(FrmChild_FormClosed);
}
public void FrmChild_Load(object sender, EventArgs e)
{
Program.formList.Add(this);
}
public void FrmChild_FormClosed(object sender, FormClosedEventArgs e)
{
Program.formList.Remove(this);
}
}
}
所有有可能被弹出的窗体都继承FrmChild窗体
public partial class Form1 : FrmChild
{
public Form1()
{
InitializeComponent();
}
}
另外,我们在编写窗体弹出事件的时候,不要再使用一下代码,
/// <summary>
/// 打开Form1窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnShow1_Click(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.Show();
}
可以直接调用“找窗体或是创建窗体”的方法,所有的窗体弹出都可以调用这样的方法:
/// <summary>
/// 打开Form1窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnShow1_Click(object sender, EventArgs e)
{
Program.FindOrCreateFrom(typeof(Form1));
}
private void btnShow2_Click(object sender, EventArgs e)
{
Program.FindOrCreateFrom(typeof(Form2));
}
private void btnShow3_Click(object sender, EventArgs e)
{
Program.FindOrCreateFrom(typeof(Form3));
}
这样,如若窗体已经打开,可以直接显示在最前方,如若还没有弹出,点击则仅会弹出一个窗体!
关于MDI窗体的跳转,可以定义一下类似的方法:
private void FindChildForm(Type type)
{
Form frm = null;
foreach (Form frmChild in this.MdiChildren)
{
if (frmChild.GetType() == type)
{
frm = frmChild;
frm.Activate();
break;
}
}
if (frm==null)
{
frm = (Form)Activator.CreateInstance(type);
frm.MdiParent = this;
frm.Show();
}
}
|