在winform的项目中窗体间传值是常见的事情,今天给大家讲解下,怎么通过自定义事件来进行窗体间执行相关函数。
本实例要实现的功能是:
多账号登陆时需要弹出账号选择窗体 用户自己选择账号后程序继续进行登陆操作。
**本实例模拟多账号登陆时弹出账号选择窗体** 1、定义所需的消息类; 2、在【消息赋值窗体/事件发起窗体】定义【事件委托】和【自定义事件】(用到自定义消息类); 3、在【消息赋值窗体/事件发起窗体】执行【自定义事件】; 4、在主窗体定义【消息赋值窗体/事件发起窗体】并调用其【自定义事件】
/// <summary> /// 自定义消息类 /// </summary> public class luyugao_com_arg : EventArgs { private string userName = ""; //这里还可以继续添加其他需要传递的消息参数 public luyugao_com_arg(string username) { this.userName = username; } public string UserName { get { return this.userName; } } }
主窗体代码
private void button1_Click(object sender, EventArgs e) { List<string> userList = new List<string>() { "赵香月", "吴若云", "竹叶青", "他大爷" }; FormChoseUserName fcun = new FormChoseUserName(userList); //调用该事件 fcun.AfterChose += Fcun_AfterChose; fcun.ShowDialog(); } private void Fcun_AfterChose(object sender, luyugao_com_arg e) { string user = e.UserName; ThreadPool.QueueUserWorkItem(x => { Invoke((EventHandler)delegate { button1.Text = "正在使用[" + user + "]登陆..."; button1.Enabled = false; }); Thread.Sleep(5000); Invoke((EventHandler)delegate { button1.Text = "开始"; button1.Enabled = true; }); showMsg("登陆成功"); }); } delegate void msgDelegate(string msg); void showMsg(string msg) { if (this.InvokeRequired) { msgDelegate d = showMsg; this.Invoke(d, msg); } else { MessageBox.Show(this, msg); } }
【消息赋值窗体/事件发起窗体】
/// <summary> /// 定义事件委托 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void SelectedDelegate(object sender, luyugao_com_arg e); /// <summary> /// 通过委托定义事件 /// </summary> public event SelectedDelegate AfterChose; private void FormChoseUserName_Load(object sender, EventArgs e) { foreach (string s in UserNameList) { listBox1.Items.Add(s); } } private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) { if (listBox1.SelectedIndex >= 0) { string user = listBox1.SelectedItems[0].ToString(); AfterChose(this,new luyugao_com_arg(user));//调用事件 this.Dispose(); } }
演示截图
源码下载地址:
http://pan.baidu.com/s/1bnKGdcF