Winform程序窗体间的跳转

关于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();

    }

}

 

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值