Событие DropDown формы Windows Combobox, приводящее к потере фокуса диалоговой формы - PullRequest
0 голосов
/ 28 января 2011

Я создаю форму параметров, которая очень похожа на форму «Подключиться к базе данных» в Visual Studio 2008 в обозревателе серверов.

Форма настроек открывается как модальное диалоговое окно из родительской формы следующим образом:

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

В SettingsForm у меня есть ComboBox, который заполнит свой список доступными именами экземпляров SQLServer.в сети через следующий код в событии DropDown:

    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"]);
            }
        }
    }

Проблема заключается в том, что всякий раз, когда пользователь нажимает стрелку DropDown на ComboBox, SettingsForm на мгновение теряет фокус на родительскую форму,SettingsForm появляется, чтобы перерисовать себя, и затем SettingsForm восстанавливает фокус.Это также приводит к тому, что фактический список DropDown не появляется, пока пользователь не щелкнет по нему снова.

Есть какие-нибудь полезные мысли по этому вопросу?

Ответы [ 2 ]

0 голосов
/ 28 января 2011

Вместо использования события DropDown для выборки доступных серверных экземпляров лучшим подходом будет использование события Form.Load.

Но если по какой-то причине вы хотите заполнить список, когда пользователь открывает раскрывающийся список, вам следует использовать ComboBox.Click Событие.

В последнем подходе, когда вы нажимаете на поле со списком, чтобы открыть его раскрывающийся список, сначала возникает событие щелчка, а затем событие DropDown, и, следовательно, не происходит обновление и потеря раскрывающегося списка. Однако при нажатии и открытии выпадающего меню все еще будет небольшая задержка. Для быстрого и идеального решения используйте событие загрузки формы.

0 голосов
/ 28 января 2011

Вероятно, вы должны сделать это ранее в жизненном цикле диалога, например Form_Load.Кроме того, даже если вам нужно было сделать это здесь, не продолжайте перезагружать список.Проверьте, загружен ли список.В противном случае вы стираете текущий выбор каждый раз, когда пользователь открывает раскрывающийся список.

...