制作登入窗体:

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

直接在按钮点击事件中,实例化一个想要打开的窗体 使用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()方法实现

winform打开唯一窗体、构造函数传值的更多相关文章

  1. C#-WinForm-跨窗体 构造函数传值 及应用—登录式窗口传值、如何关闭主页面时关闭应用程序、如何打开唯一窗口—★★★★★五星重量级

    构造函数可以传任意类型的值,并可以同时传多个值 结构函数传值的初步应用--简单的登陆式界面 现在我有两个窗体Form3和Form4,如下,如何点击Form3中的按钮后,打开Form4并将Form3中的 ...

  2. C#-WinForm-★★★★★跨窗体 构造函数传值 及应用—登录式窗口传值、如何关闭主页面时关闭应用程序、如何打开唯一窗口★★★★★

    构造函数可以传任意类型的值,并可以同时传多个值 结构函数传值的初步应用——简单的登陆式界面 现在我有两个窗体Form3和Form4,如下,如何点击Form3中的按钮后,打开Form4并将Form3中的 ...

  3. winform窗体 小程序【打开多个窗体、窗体之间传值、打开唯一窗体】

    1.打开多个窗体 2.窗体之间的传值 3打开唯一窗体

  4. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  5. C# Winform多窗体&&构造函数传值

    一.多窗体:三种打开窗体的状态: 最最基础的弹窗: //写在按钮的点击事件内: //实例需要弹出的窗口的类: Form2 f2 = new Form2(); f2.Show(); 1.弹窗窗口: // ...

  6. winform 打开一个窗体,关闭一个窗体

    例如  我要打开一个窗体b,关闭一个窗体a a中的代码添加: private void pictureBox5_Click(object sender, EventArgs e) { W_MainFo ...

  7. winform两个窗体之间传值(C#委托事件实现)

    委托 定义一个委托,声明一个委托变量,然后让变量去做方法应该做的事. 委托是一个类型 事件是委托变量实现的 经典例子:两个winform窗体传值 定义两个窗体:form1和form2 form1上有一 ...

  8. C# winform打开新窗体显示一段时间 关闭新窗体

    1.form1的button事件下: form2 form = new form2(); form.Show(); Thread.Sleep(10000);  //form2窗体显示10秒 form. ...

  9. C# winform 打开新窗体 关闭当前窗体

    Form1 的Button 下 { Form2 f2 = new Form2(); f2.ShowDialog(this);// this.Close(); } Form2 的load 下 { //只 ...

随机推荐

  1. uniq DEMO

    测试数据: [weblogic@etp-mall-dev7][/tmp]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss op ...

  2. struts2的两个核心配置文件

    struts2的两个核心配置文件,即:struts.default.xml和struts.properties A,位置:都在struts2-core-version.jar文件中 B,作用,stru ...

  3. jQuery_Ajax_Json 异步接收PHP端传来的json数据

    [json]{"user_id":"1172940","rmb_point":"0","weixin_id&q ...

  4. dedecms的title怎么优化?

    (1)首页:index.htm 模板:<title>k1,k2,k3 {dede:global.cfg_webname/}</title> 规则:3个关键词+网站名称 示例:& ...

  5. Unix/Linux编程实践教程(二:socket、多线程、进程间通信)

    同一接口不同的数据源: 协同进程: fdopen以文件描述符为参数: fopen和popen: 为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell ...

  6. 【转】MYSQL入门学习之十三:自定义函数的基本操作

    转载地址:http://www.2cto.com/database/201212/177382.html 一.自定义函数(UDF)的特性和功能  www.2cto.com           函数能分 ...

  7. MySQL 及 SQL 注入

    如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符. 所谓SQL注入,就是 ...

  8. 20150813 Asp.net 关闭子窗体 刷新Tree控件

    主窗体************************************************************************************ using System ...

  9. 如何在 Eclipse 中连接源码

    1:首先在window 中 打开首选项(preferences) 找到如下java -- 已安装的JRE

  10. 《Effective C++》读书摘要

    http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...