Windows Form Combobox DropDown事件导致对话框失去焦点

时间:2011-01-27 21:21:06

标签: c# combobox focus

我正在创建一个与服务器资源管理器中的Visual Studio 2008“连接到数据库”表单非常相似的设置表单。

设置表单从父表单打开为模式对话框,如下所示:

    private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        var SettingsForm = new frmSettings();
        SettingsForm.ShowDialog(this); 
    }

在SettingsForm上,我有一个ComboBox,它将通过DropDown事件中的以下代码使用网络上可用的SQLServer实例名称填充其列表:

    private void cboTrackingServerName_DropDown(object sender, EventArgs e)
    {
        DataTable dt = SmoApplication.EnumAvailableSqlServers(false);
        if (dt.Rows.Count > 0)
        {
            cboTrackingServerName.Items.Clear();

            foreach (DataRow row in dt.Rows)
            {
                cboTrackingServerName.Items.Add(
                     row["Server"] + "\\" + row["Instance"]);
            }
        }
    }

问题在于,每当用户单击ComboBox上的DropDown箭头时,SettingsForm会立即将焦点丢失到其父窗体,SettingsForm似乎重绘自身,然后SettingsForm重新获得焦点。这也会导致实际的DropDown列表在用户再次单击它之前不会显示。

有关此事的任何有用的想法?

2 个答案:

答案 0 :(得分:0)

您可能应该在对话框生命周期中更早地执行此操作,例如Form_Load。此外,即使您需要在此处执行此操作,也不要继续重新加载列表。检查列表是否已加载。否则,每次用户打开下拉列表时,您都会清除当前选择。

答案 1 :(得分:0)

不使用DropDown事件来获取可用服务器实例,最好的方法是使用Form.Load事件。

但是,如果由于某种原因您希望在用户打开下拉列表时填写列表,那么您应该使用 ComboBox.Click 事件。

在后一种方法中,当您单击组合框以打开其下拉列表时,首先会引发click事件,然后是DropDown Event,因此不会刷新和丢失下拉列表。但是点击和打开下拉列表仍然会有一点延迟。对于快速完美的解决方案,请使用表单加载事件。