打开多个窗体,构造函数传值,打开唯一窗体

准备多个窗口  Form1,2,3

Form1为主窗口

给Form1放两个按钮,点击一个按钮打开Form2  另一个点击打开Form3

在按钮1的点击事件里面 实例化一个Form2  f2 = new Form2();  然后 f2.show(); 就可以打开f2窗口。

为了用户体验考虑 ,  新打开窗体最好是屏幕居中,在属性里面StartPosition设置CenterScreen。还有根据父级居中。

如果把Form1作为登录窗口,

那么登陆成功后弹出Form2窗口,  那样按找常理来说登陆成功就会关闭登录窗口,只留下内容窗口,可是作为主窗口的Form1如果关闭就会关闭所有窗口,所以只要把它隐藏就可以,这里使用this.Hide();来实现隐藏Form1.  this代表窗体。

那么问题来了。把主窗体隐藏了怎么退出程序呢,就算把所有子窗体关闭,Form1还是开启,而且是隐藏的。

这里就需要事件来触发。  

给Form1登陆成功后显示的Form2窗体设置一个Formclosing窗体关闭时触发的事件,发生在窗体关闭之前点击关闭之后。

在Form2关闭时  关闭Form1   但是这里想要在子窗口中控制父窗口需要  进行构造函数传值。

在Form2实例化的时候把Form1的值传进去,同时在Form中,实例化Form2的时候也要把要传的值放进去。此时想要在Form2关闭Form1,所以传入一个Form(所有窗体类型的基类)值。 this可以代表这个窗体。

在某些情况下,需要用到某个已经获取到的值,为了提高程序运行效率,不能再次查询这个值,这时候就需要传递值.

窗体间值的传递需要用到打开窗体,构造函数执行的过程就是打开窗体的过程(自己理解的)。

Form2 f2 = new Form2(要传递的值);
f2.Show();

这个时候值已经传递到Form2去了,这时候需要考虑如何在Form2中取出这个值

复制代码
Form z = null;//根据值的类型实例化
public Form2(Form a) //方法这里也要写要传入的值,注意类型
{
InitializeComponent();
z = a; //这个时候值就传递进来了,因为值定义在方法外面,所有在这个命名空间里面可以随意调用
}

现在就可以引用Form1的窗口属性或者公共属性的方法。

 

 

打开唯一窗体  

 

打开唯一窗体就是在上面多窗体之间操作传值的基础上进行限制

大体思路就是  

创建一个窗体集合
每一个打开的窗体对象都放入此集合中

每次再要打开窗体时都要去集合中判断此窗体是否已经被打开了

关闭子窗体时,要在父窗体的集合中删掉对应的子窗体对象,才可以重新打开新的子窗体

直接附上全部代码

private void button1_Click(object sender, EventArgs e)
        {
            Users u = new UsersData().SelectUser(textBox1.Text.Trim(), textBox2.Text);

            if (u != null)
            {
                Form2 f2 = new Form2(u, this);
                f2.Show();
                this.Hide();
            }
            else
                MessageBox.Show("用户名或密码错误!");

        }
Form1 登录窗口,父级窗口
Form1 F1 = null;
        public Form2(Users us, Form1 f1)
        {
            InitializeComponent();

            label1.Text = "欢迎你," + us.NickName + "!";

            F1 = f1;
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            F1.Close();
        }

        List<Form> FormList = new List<Form>();

        private void button1_Click(object sender, EventArgs e)
        {
            bool has = false;
            Form3 f3 = new Form3(this);

            foreach (Form f in FormList)
            {
                if (f is Form3)
                {
                    has = true;
                    f3 = f as Form3;
                }
            }

            if (has)
            {
                f3.WindowState = FormWindowState.Normal;
                f3.Focus();
            }
            else
            {
                FormList.Add(f3);
                f3.Show();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            bool has = false;
            Form4 f4 = new Form4();

            foreach (Form f in FormList)
            {
                if (f is Form4)
                {
                    has = true;
                    f4 = f as Form4;
                }
            }

            if (has)
            {
                f4.WindowState = FormWindowState.Normal;
            }
            else
            {
                FormList.Add(f4);
                f4.Show();
            }
        }


        public void DeleteForm(Form f)
        {
            FormList.Remove(f);
        }
Form2 主窗体
Form2 F2 = null;
        public Form3(Form2 f2)
        {
            InitializeComponent();
            F2 = f2;
        }

        private void Form3_FormClosing(object sender, FormClosingEventArgs e)
        {
            F2.DeleteForm(this);//调用Form2里的方法,清除集合里的窗口。
        }
Form3 子窗口

 

posted @ 2017-05-03 17:03  超级芒果  阅读(307)  评论(0编辑  收藏  举报