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

    制作登入窗体:

    制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体

    直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false

                    Form1 f1 = new Form1();
                    f1.Show();
                    this.Visible = false;                

    另:这样写的话再关闭第二个窗口的时候,程序并没有完全结束,第一个登陆窗口仍然存在,虽然不显示

    因此我们用到构造函数传值,并且这样可以实现打开唯一窗口(不重复打开同一个窗口)

    构造函数传值:

    构造函数可以设置参数,当实例化这个窗体时,可以把某个我们需要的类型的参数传递进来,比如要点击登录时,将一个User自定义对象以及登录窗体本身传递给将要打开的窗体

    复制代码
        Form2 F2 = null;
            public Form1(Form2 f2, Users u)
            {
                InitializeComponent();
                F2 = f2;        txt_username.Text = u.UserName;//传递进来的对象使用示例 
            }
    复制代码

    由于作用域问题,传递进来的参数只能在构造函数中使用,可在外面设置一个全局变量,在构造函数中把传递进来的值赋给全局变量,这样在本程序中其他事件可以随意调用,如上

    因为form1不是主窗体 所以关闭form1时并不会结束程序,我们只需要写一个关闭form1时触发的事件即可(FormClosing或FormClosed):

            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                F2.Close();
            }

    此时使用到了上面传递进来的f2,通过赋值给全局变量F2从而控制了form2的关闭。

    打开唯一窗体:

    如果多次点击同一个登陆按钮,打开了多个登陆后的窗体,这样是不合理的

    同样可以通过构造函数传值来控制,在主窗体中创建一个list<Form>公共集合

    复制代码
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            public List<Form> Flist = new List<Form>();
    
            private void button1_Click(object sender, EventArgs e)
            {
                int count = 0;//标记变量 标记集合中是否已有此窗体
    
                Form2 f2 = new Form2(this);//实例化一个Form2窗体并且把Form1自己传进去
                foreach (Form f in Flist)//遍历集合
                {
                    if (f is Form2)
                    {
                        count++;
                    }
                }
    
                if (count == 0)//如果集合中没有Form1窗体 则打开它
                {
                    Flist.Add(f2);
                    f2.Show();
                }
            }
        }
    复制代码

    那么,当Form2关闭的时候,设置关闭事件,将From2自己从集合中删掉

    复制代码
    public partial class Form2 : Form
        {
            Form1 F1 = null;//定义全局变量用于在下面使用,先等于空,在构造函数运行,也就是打开窗体的时候再赋值
    
            public Form2(Form1 f1)
            {
                InitializeComponent();
                F1 = f1;
            }
    
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                F1.Flist.Remove(this);//把Form2自己从集合中删掉
            }
        }
    复制代码

    这样,就实现了当Form2处于没打开的状态时,点击按钮将Form2打开,否则不执行任何操作,并且当Form2关闭时,删掉集合中的Form2,这样再次点击按钮的时候可以重新打开Form2

    附:

    1、ComboBox绑定数据源后,可设置显示的数据与其value数据,value数据是不显示出来的,但是可以在程序中使用,尤其方便在数据库多个表之间查找数据

                cmb_class.DataSource = new ClassData().select();//自定义方法,返回一个List<Class>集合
                cmb_class.DisplayMember = "ClassName";//设置下拉菜单显示的是班级的名字
                cmb_class.ValueMember = "ClassCode";  //设置下拉菜单每一项的value值是班级的代号

    数据库中有四条班级数据,此时在程序中显示的是:

    我们写一个事件,当此下拉菜单的选中数据发生改变时触发,弹出其value值让我们查看

            private void cmb_class_SelectedValueChanged(object sender, EventArgs e)
            {
                MessageBox.Show(cmb_class.SelectedValue.ToString());
            }        

    2、点击按钮,如果想要打开的窗口已经打开,则让其焦点进入:可通过获取窗口使用Activate()方法实现

  • 相关阅读:
    OnEraseBkgnd、OnPaint与画面重绘
    .编译ADO类DLL时报错的解决方案
    VC列表框样式
    Codeforces 131D. Subway 寻找环树的最短路径
    Codeforces 103B. Cthulhu 寻找奈亚子
    Codeforces 246D. Colorful Graph
    Codeforces 278C. Learning Languages 图的遍历
    Codeforces 217A. Ice Skating 搜索
    Codeforces 107A. Dorm Water Supply 搜图
    Codeforces 263 D. Cycle in Graph 环
  • 原文地址:https://www.cnblogs.com/wy1992/p/6155705.html
Copyright © 2011-2022 走看看