Кнопка предварительного просмотра и кнопка «Принять» - PullRequest
1 голос
/ 13 апреля 2009

Используя winforms, я установил для свойства KeyPreview значение true и у меня есть дескрипторы событий для соответствующих ключевых событий в базовой форме.

В формах, которые наследуются от него, я устанавливаю свойство AcceptButton в соответствии с требованиями приложения.

В некоторых случаях я хочу, чтобы клавиша ввода имела функциональность, отличную от функции AcceptButton.

Я надеялся зафиксировать нажатие клавиши ввода в моей базовой форме и проверить наличие особых случаев, когда я не хочу запускать событие AcceptButton.

Похоже, однако, что щелчок AcceptButton выполняется до любого из ключевых событий в моей форме basef. Я мог бы написать функциональность в событиях нажатия возможных кнопок принятия, но, на мой взгляд, это было бы хаком.

Есть предложения?

Спасибо.

Ответы [ 2 ]

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

Другой способ справиться с этим - переопределить метод ProcessDialogKey () формы, где вы можете подавить кнопки подтверждения и / или отмены. Например, у меня есть приложение с редактором фильтров, который фильтрует сетку на основе пользовательского ввода. Я хочу, чтобы пользователь мог нажимать клавишу возврата, когда элемент управления редактора фильтра имеет фокус для применения фильтра. Проблема в том, что код кнопки подтверждения запускается и закрывает форму. Код ниже решает проблему.

    protected override bool ProcessDialogKey(Keys keyData)
    {
        // Suppress the accept button when the filter editor has the focus.
        // This doesn't work in the KeyDown or KeyPress events.
        if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus))
            return false;

        return base.ProcessDialogKey(keyData);
    }

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

    private readonly List<Control> _disableAcceptButtonList = new List<Control>();

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0))
        {
            foreach (Control control in _disableAcceptButtonList)
                if (control.ContainsFocus)
                    return false;
        }

        return base.ProcessDialogKey(keyData);
    }

    protected virtual void DisableAcceptButtonForControl(Control control)
    {
        if (!_disableAcceptButtonList.Contains(control))
            _disableAcceptButtonList.Add(control);
    }
0 голосов
/ 21 апреля 2009

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

События KeyPreview могли сделать что-то похожее на описанное выше. Если у кого-то есть более элегантное решение, я все равно хотел бы знать.

Спасибо.

...