在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