ComboBox не теряет фокус - PullRequest
       31

ComboBox не теряет фокус

4 голосов
/ 02 августа 2009

У меня были проблемы с элементом управления ComboBox. Я не специалист по GUI, но я знаю, что эта проблема связана с фокусом элемента управления.

По какой-то причине ComboBox не теряет фокус, когда я щелкаю за его пределами. Скажем, например:

  1. Я нажимаю на ComboBox, чтобы перечислить его элементы.
  2. Я выбираю один предмет. Это закрывает ComboBox.
  3. Я нажимаю на второй ComboBox, первый остается сфокусированным.

OR

  1. Нажмите на поле со списком (содержит точку, твердое тело и каркас).
  2. Нажмите на форму. Нажмите P, S или W. См. Выбор изменить.

Обратите внимание, что ComboBox имеет только DropDownStyle , установленный на ComboBoxStyle.DropDownList . Это означает, что это стандартное поведение ComboBox. Я думал, что поведение по умолчанию было то, что ComboBox потерял бы свой фокус, когда вы щелкнули по нему, или на другом элементе управления (кнопка или ComboBox). Это не тот случай, почему?

UPDATE: Мне нужно что-то вроде ActiveComponent = null. Поведение должно быть таким же, как в Visual Studio, если вы выбрали Отладка или Выпуск (ComboBox) на стандартной панели инструментов. В настоящее время, если я нажимаю за пределами ComboBox, он все еще сосредоточен.

Ответы [ 13 ]

16 голосов
/ 08 августа 2009

Возможно, вы захотите взглянуть на В этой теме . Попробуйте установить для параметра CausesValidation значение false в поле со списком, посмотрите, можете ли вы его оставить. Если в обработчике события OnValidating возникает исключение, оно не снимает флажок.

3 голосов
/ 01 октября 2012

Все, что вам нужно сделать, это:

  1. перейти к окну свойств Combobox
  2. и установите Allow Drop = "true"

Свойство предназначено для каких-то других целей, но оно работает и для этого сценария.

3 голосов
/ 07 августа 2009

Вы уверены, что проблема не в том, что ни у вашего фрейма, ни у вашего другого комбинированного списка нет способа получить фокус?

2 голосов
/ 02 сентября 2009

У меня была похожая проблема, но контроль рекурсивно терял и возвращал фокус; вызывался обработчик события LostFocus, но элемент управления немедленно восстановил фокус. Установка свойства CausesValidation на false не имела никакого эффекта.

В моем случае при привязке к пользовательскому объекту я связывался со свойством SelectedValue вместо свойства Text. Поскольку я вручную указал коллекцию элементов ComboBox и не предоставил источник данных, свойство ValueMember отсутствует или недопустимо (поэтому, конечно, свойство SelectedValue бесполезно.)

Изменение моей привязки для использования свойства Text решило проблему.

2 голосов
/ 02 августа 2009

Так что именно вы говорите? Вы говорите, что ваш обработчик событий _LostFocus () не вызывается? Если это так, то первое место, которое я бы посмотрел, было в вашем сгенерированном дизайнером коде отображения обработчика событий. Иногда это может привести к отстранению от работы в конструкторе (хотя в наши дни это случается редко)

1 голос
/ 12 апреля 2016
  1. После SendKeys.Send("{ESC}"); ComboBox все еще восстанавливает фокус;

  2. Установка значения CausesValidation в поле со списком также мне не помогла.

Вот как я решил эту проблему:

Предположим, у вас есть другой элемент управления, например System.Windows.Forms.PictureBox pbxChart, и пользователь хочет переместить фокус прямо после изменения значений в combobox (selecting by Left Click or MouseWheel). И я добавил:

    private void pbxChart_Click(object sender, EventArgs e)
    {
        pbxChart.Focus();
    }

в MouseClick EventHandler, что решило проблему.

1 голос
/ 01 февраля 2011

Попробуйте оставить событие вместо LostFocus.
Попробуйте ввести событие вместо GotFocus.

1 голос
/ 05 сентября 2009

У меня была похожая проблема, и я попробовал все методы, которые вы, ребята, предложили. К сожалению, ни один из них не работает. Вот мое «простое» решение: отправьте ключ «ESC» после изменения SelectedIndex.

ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
# do whatever you were doing
...
...
  SendKeys.Send("{ESC}");
}

Это сработало для меня.

0 голосов
/ 03 июля 2018

Как я это сделал, как следует.

Шаг 1 - Создать метод, который возвращает все заданные элементы управления в форме

    public IEnumerable<Control> GetAllControls(Control control, Type type)
    {
        var controls = control.Controls.Cast<Control>();
        return controls.SelectMany(ctrl => GetAllControls(ctrl, type))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == type);
    }

Шаг 2. Создание пользовательского события

    private void ChangeComboFocus(object sender, EventArgs e)
    {
        SendKeys.Send("{TAB}");
    }

Шаг 3 - окончательно связать событие при загрузке формы

    private void ClientRegistrationForm_Load(object sender, EventArgs e)
    {
        var comboxes=_Helper.GetAllControls(this, typeof(ComboBox)).ToList();
        if (comboxes != null)
        {
            foreach (ComboBox item in comboxes)
            {
                item.SelectedIndexChanged +=new EventHandler(this.ChangeComboFocus) ;
            }
        }
    }
0 голосов
/ 23 апреля 2016
 private void drp_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                SendKeys.Send("{TAB}");
            }
        }

или используйте

этот код на контрольной функции выхода:

 private void drp_Leave(object sender, KeyPressEventArgs e)
            {

                    SendKeys.Send("{TAB}");

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...