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>公共集合(利用便利集合来取值窗口,建立一个包含窗口的集合,再利用if,标记变量来判断)
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()方法实现
最新文章
- [LeetCode] LFU Cache 最近最不常用页面置换缓存器
- AWS S3 CLI的权限bug
- #知识#室内设计原理ing
- vc个版本对应的vs版本
- 一个优秀windows C++程序员的知识体系
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
- 随笔001:Group by 语法剪辑
- java Spring集合
- libevent for qt网络模块
- MYSQL知识点
- 设M=5^2003+7^2004+9^2005+11^2006,求证8|M。(整除理论,1.1.8)
- javascript 用Activex方法调用数据库中的数据,只可用于IE
- vue-cli完整地引入element-ui
- Dynamics CRM2016 Web API之Use custom FetchXML
- Android调试神器stetho使用详解和改造
- NI_NUMERICHOST"; is not exported by the Socket module ";getaddrinfo"; is not expo
- 常见26种NLP任务的练手项目
- MySQL中lock tables和unlock tables浅析
- 2016521-Java-第八周学习总结
- Javascript htmldecode