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

制作登录窗体:

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

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

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

登陆界面

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)
        {

        }
    }
}

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

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

构造函数传值:

构造函数可以设置参数,当实例化这个窗体时,可以把某个我们需要的类型的参数传递进来,比如要点击登录时,将一个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

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

时间: 2024-12-16 13:04:10

Winform 主窗体更换 构造函数传值的相关文章

winform修改、打开窗体、构造函数传值

制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form1 f1 = new Form1(); f1.Show(); this.Visible = false; 另:这样写的话再关闭第二个窗口的时候,程序并没有完全结束,第一个登陆窗口仍然存在,虽然不显示 因此我们用到构造函数传值,并且这样可以实现打开唯一窗口(不重复打开同一个窗口) 构造函数传值: 构造

winform打开唯一窗体、构造函数传值

制作登入窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form1 f1 = new Form1(); f1.Show(); this.Visible = false; 另:这样写的话再关闭第二个窗口的时候,程序并没有完全结束,第一个登陆窗口仍然存在,虽然不显示 因此我们用到构造函数传值,并且这样可以实现打开唯一窗口(不重复打开同一个窗口) 构造函数传值: 构造

【2017-04-27】布局及容器控件、打开多窗体、构造函数传值、打开唯一窗口

一.布局和容器控件 1.布局属性 - Anchor  控件定位锁死在那个位置,根据哪个位置锁死. - Dork     填充满.填充上下左右. - Location  位置. 2.容器控件 - Panel  相当于html中的div. - FlowLayoutPanel  继承自Panel,多了流式布局功能 - GroupBox    继承自Panel,多了一个标题,有小虚线. - TabControl  选项卡 选项卡修改标题,用选项卡的TabPages属性,在每个选项卡标题对应的Text属性

委托:Winform实现窗体间的传值

软件界面如上所示:点击接收窗体实现打开发送窗体,发送窗体点击“发送”,即可发送到接收窗体,可以实现窗体间的传值. 接收窗体的主要代码: /// <summary> /// 打开发送窗体 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOpen_Click(o

Winform主窗体设计

主窗体顶部为菜单按钮,子窗体内嵌入Panel显示 界面如下: 第二步,主窗体离不开的几个方法 1,点击菜单功能,加载子窗体 private void btnOpenForm_Click(object sender, EventArgs e)        {            try            {                string frmName = ((ButtonX)sender).Tag.ToString();                CloseForm()

Winform主窗体的设置

软件必然涉及到一个主窗体MainForm,下面介绍一下几个简单的属性设置,可能比较有用 (1)icon,当然是咱们软件的图标了,设置上去即可 (2)isMdiContainer,这个比较重要了哦,必须设置为true,那菜单调用出来的窗体就是主窗体的子窗体了哦 (3)MainMenuStrip,这是主窗体的菜单了,要选择一个咱们放到窗体上的菜单,菜单的设置后面介绍 (4)ShowInTaskBar,呵呵,设为true了,这样我们的软件运行起来就会在windows的任务栏上出现,对于大多数人来说这个

C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现WinForm窗体换肤然而IrisSkin2.dll只能在.NET Faremwork 4.0以及之前的版本使用,所以要在VS2010中使用它需要将自己的项目框架设置为.NET Framework 4.0,还有另一种方法就是使用IrisSkin4.dll,他的使用方法和IrisSkin2.dll基本是完全一样的 一.首先在网上下载 IrisSkin4.dll (已与皮肤一起打包),将IrisSkin4.dll与Skins(

winform(三)——更换主窗体例子

做一个登录窗口,登录成功时关闭form1,展示from2界面 1.主界面Login namespace WindowsFormsApplication1 { public partial class Login : Form { public string username;//定义一个变量给子窗体传值 public Login() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e)

C# WinForm 父窗体 子窗体 传值

C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值==================1.点击Form1的button1 打开Form2  父窗体给子窗体传值 可以调用重载子窗体的构造函数 直接传入相关数值 public partial class Form1 : Form    {        public Form1()        {