• Winform 主窗体更换 构造函数传值


    制作登录窗体:

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

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

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

    登陆界面

    namespace WindowsFormsApplication1
    {
        public partial class Login : Form
        {
            public string username;//定义一个变量给子窗体传值
            public Login()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //取出用户名和密码
                string uid = txtuid.Text;
                string pwd = txtpwd.Text;
    
                if (uid != "" && pwd != "")
                {
                    LoginDA da = new LoginDA(); //连接数据库
                    if (da.DengLu(uid, pwd)) //登录查询
                    {
    
                        //将用户名赋值给成员变量username
                        username = uid;
                        //将该窗体的返回值变为OK
                        this.DialogResult = DialogResult.OK;
                        //将该窗体关闭
                        this.Close();
    
                    }
                    else
                    {
                        MessageBox.Show("用户名或密码错误!");
                    }
                }
                else
                {
                    MessageBox.Show("用户名和密码不能为空!");
                }
            }
    
            private void Login_Load(object sender, EventArgs e)
            {
    
            }
        }
    }
    View Code

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

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

    构造函数传值:

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

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

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

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

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

    此时使用到了上面传递进来的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();
                }
            }
        }
    View Code

    那么,当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

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

     private void Form1_Load(object sender, EventArgs e)
            {
                userdata ud = new userdata();
                comboBox1.DataSource = ud.Select1("Nation");
                comboBox1.DisplayMember = "name";
                comboBox1.ValueMember = "code";
                userdata ud1 = new userdata();
                comboBox2.DataSource = ud1.Select1("Class");
                comboBox2.DisplayMember = "name";
                comboBox2.ValueMember = "code";
            }
               //查询
                comboBox1.SelectedText = u.nation;
                comboBox2.SelectedText = u.Class;
               //修改或新建
                n.nation = comboBox1.SelectedValue.ToString();
                n.Class = comboBox2.SelectedValue.ToString();
    View Code
  • 相关阅读:
    页面性能
    js运行机制
    渲染机制
    通信类
    js面向对象 继承
    原型
    [HEOI2016/TJOI2016]求和
    「NOIP2018 保卫王国」
    「LGP4719【模板】动态dp」
    多项式进阶操作
  • 原文地址:https://www.cnblogs.com/shadow-wolf/p/6147814.html
Copyright © 2020-2023  润新知