【问题标题】:C# Windows Forms, Combobox MouseClick event getting fired multiple timesC# Windows 窗体,Combobox MouseClick 事件被多次触发
【发布时间】:2013-05-09 20:36:45
【问题描述】:

我有一个带有许多控件的 Windows 窗体。其中一小部分是登录到 SQL 服务器并获取数据库名称列表并将集合分配给组合框。

    private void InitializeComponent()
    {

        //...
        //...
        this.ServerTB = new System.Windows.Forms.TextBox();
        this.UserNameTB = new System.Windows.Forms.TextBox();
        this.PasswordTB = new System.Windows.Forms.TextBox();
        //...
        //...

        this.ServerTB.TextChanged += new System.EventHandler(this.OnSQLServerChanged); 
        this.UserNameTB.TextChanged += new System.EventHandler(this.OnSQLServerChanged);     
        this.PasswordTB.TextChanged += new System.EventHandler(this.OnSQLServerChanged);     


        this.DatabaseCmbBox = new System.Windows.Forms.ComboBox();
        //...
        //...
        this.DatabaseCmbBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.DatabaseCmbBox_Click);

        //....

    }

    private void DatabaseCmbBox_Click(object sender, MouseEventArgs e)
    {
        MessageBox.Show(sender.GetType().ToString());

        this.Cursor = Cursors.IBeam;

        List<string> dbList = new List<string>();

        dbList = GetDatabaseList();

        DatabaseCmbBox.DataSource = dbList;

        DatabaseCmbBox.SelectedIndex = -1;


        if (dbList.Count > 0)
        {
            DatabaseCmbBox.MouseClick -= DatabaseCmbBox_Click;
        }


        DatabaseCmbBox.Focus();

        this.Cursor = Cursors.Default;
    }

    protected List<string> GetDatabaseList()
    {
        List<string> list = new List<string>();

        string conString = "server=" + ServerTB.Text + ";uid=" + UserNameTB.Text + ";pwd=" + PasswordTB.Text + "; database=master";

        try
        {

            using (SqlConnection con = new SqlConnection(conString))
            {
                con.Open();

                using (SqlCommand cmd = new SqlCommand("select name from sys.databases where name not in ('master', 'model', 'tempdb', 'msdb') ", con))
                {
                    using (IDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            list.Add(dr[0].ToString());
                        }

                        dr.Close();
                    }

                    cmd.Dispose();
                }                    

                con.Close();
            }
        }
        catch(SqlException ex)
        {
            DatabaseCmbBox.MouseClick -= DatabaseCmbBox_Click;
            MessageBox.Show(ex.Message);
            ServerTB.Focus();
        }

        return list;

    }

    private void OnSQLServerChanged(object sender, EventArgs e)
    {
        DatabaseCmbBox.MouseClick += DatabaseCmbBox_Click;
    }

我在获取数据库列表时没有问题。这样做大约需要 10 秒钟。通过事件处理程序中的消息框,我发现 MouseClick 事件无缘无故地被触发了 38 次。即使我使用 Enter 事件或 Click 事件而不是 MouseClick 事件,也会发生同样的事情。

为什么会发生这种情况,如何使用这类事件?

提前致谢, RPS。

【问题讨论】:

  • 我猜,事件处理程序被多次钩住了。但是我怎么知道事件是否已经被钩住了呢?

标签: c# winforms mouseclick-event


【解决方案1】:

如果您想获取数据库列表,为什么不在 Combobox 值更改事件中这样做?

不管怎样,我看到你在做

private void OnSQLServerChanged(object sender, EventArgs e)
    {
        DatabaseCmbBox.MouseClick += DatabaseCmbBox_Click;
    }

这应该可以解决您的问题

private void OnSQLServerChanged(object sender, EventArgs e)
    {
DatabaseCmbBox.MouseClick -= DatabaseCmbBox_Click;
        DatabaseCmbBox.MouseClick += DatabaseCmbBox_Click;
    }

【讨论】:

  • 组合框本身必须填充数据库列表。但是使用 Click 或 enter 或 MouseClick 事件之一有什么问题?为什么他们会被解雇多次?
  • 感谢 Ehsan。它有效.. 有一个问题.. TextBox 上的 TextChanged 事件会被触发多少次?在更正之前,MouseClick 事件被触发了 38 次。为什么会这样?
  • 因为您已经多次链接它,即在每个更改的 sql 服务器上,您都在挂钩一个新事件而不删除前一个事件。请将其标记为答案。
【解决方案2】:

这是一个潜在的错误:您应该只订阅一次DatabaseCmbBox.MouseClick,而不是每次都订阅OnSQLServerChanged。相应地更正您的代码,多点击事件的问题将得到修复:

private void OnSQLServerChanged(object sender, EventArgs e)
    {
        DatabaseCmbBox.MouseClick += DatabaseCmbBox_Click;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多