Как отменить выбор текстового поля, если пользователь нажимает в другом месте формы? - PullRequest
6 голосов
/ 26 августа 2011

В настоящее время в моем приложении невозможно отменить выбор текстового поля.Единственный способ - выбрать другое текстовое поле.Мои пользователи и я согласны с тем, что нажатие в любом месте формы должно отменить выбор текущего текстового поля.Я попытался переопределить MouseDown на многих элементах управления и установить фокус на случайную метку, но он не работает для некоторых элементов управления, таких как MenuStrip или полосы прокрутки.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 14 октября 2014

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

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

Код для выполнения выглядит следующим образом:

    private void HookControl(Control controlToHook)
    {
        // Add any extra "unfocusable" control types as needed
        if (controlToHook.GetType() == typeof(Panel)
            || controlToHook.GetType() == typeof(GroupBox)
            || controlToHook.GetType() == typeof(Label)
            || controlToHook.GetType() == typeof(TableLayoutPanel)
            || controlToHook.GetType() == typeof(FlowLayoutPanel)
            || controlToHook.GetType() == typeof(TabControl)
            || controlToHook.GetType() == typeof(TabPage)
            || controlToHook.GetType() == typeof(PictureBox))
        {
            controlToHook.MouseClick += AllControlsMouseClick;
        }
        foreach (Control ctl in controlToHook.Controls)
        {
            HookControl(ctl);
        }
    }
    void AllControlsMouseClick(object sender, MouseEventArgs e)
    {
        FocusLabels(this);
    }
    private void FocusLabels(Control control)
    {
        if (control.GetType() == typeof(Label))
        {
            control.Focus();
        }
        foreach (Control ctl in control.Controls)
        {
            FocusLabels(ctl);
        }
    }

И затемдобавьте это в событие Form_Load:

HookControl(this);
2 голосов
/ 26 августа 2011

Если у вас нет других элементов управления на форуме, попробуйте добавить элемент управления Panel, который может получать фокус.

Установите для TabIndex элемента управления Panel значение, меньшее, чем у элемента управления TextBox или NumericUpDown.

Теперь, когда ваша основная форма получает фокус, Panel должен получить фокус вместо области TextBox.

ScreenShot

1 голос
/ 26 августа 2011

Поскольку у вас, вероятно, есть ярлык или какой-либо другой элемент управления в вашей winform, я бы выбрал решение , рекомендованное здесь , и просто выделю фокус на ярлыке при нажатии на форму.

В худшем случае, вы можете даже добавить метку, расположенную в позиции -100, -100, установить его первым в порядке табуляции и сфокусировать () на щелчке формы.

0 голосов
/ 26 августа 2011

У меня есть какой-то "обходной путь" для вас. Просто, но другой элемент управления (который может получить фокус) в фоновом режиме. Я протестировал это для GridView (который закрасит ваш элемент управления в серый) - но вы должны иметь возможность сделать это с помощью пользовательского элемента управления нужного цвета или просто установить цвет фона вида сетки (doh). Таким образом, каждый раз, когда пользователь нажимает на фон, этот backgroundcontrol получает фокус.

...