zoukankan      html  css  js  c++  java
  • 打开多个窗体,构造函数传值,打开唯一窗体

    准备多个窗口  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 子窗口
  • 相关阅读:
    Xcode的控制台调试命令
    android 分辨率自适应
    android 分辨率自适应
    android屏幕适配
    android屏幕适配
    最新版本的ADT使用问题
    最新版本的ADT使用问题
    UVa 1639 Candy (数学期望+组合数学+高精度存储)
    UVa 12230 && HDU 3232 Crossing Rivers (数学期望水题)
    HDU 1087 Super Jumping! Jumping! Jumping! (DP+LIS)
  • 原文地址:https://www.cnblogs.com/big-lll/p/6802823.html
Copyright © 2011-2022 走看看