?

Log in

No account? Create an account
Dotnet_am

dotnet_am


C# и платформа .NET в вопросах и ответах

.NET технологии в Армении


Previous Entry Share Next Entry
3.1.1 Как реализовать переход между элементами управления на форме при нажатии на Enter
Dotnet_am
dotnet_am
Довольно естественное желание для пользователя, чтобы при нажатии на Enter курсор перемещался на следующее поле ввода. Я реализовал это в событии  KeyDown формы довольно заковыристым способом.
Если у вас есть более оптимальное решение - поделитесь. 
Для того, чтобы этот способ работал, свойство формы KeyPreview должно быть установлено в true.  

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
        SetFocusOnNextControlKeyDown(this, ActiveControl, e);
}

private void SetFocusOnNextControlKeyDown(Control container, Control activeControl, KeyEventArgs e)
{
    try
    {
        if (e.KeyCode == Keys.Enter)
        {
            Control Ctrl;
            Ctrl = container.GetNextControl(activeControl, true);
            if (Ctrl != null)
            {
                if (Ctrl is TextBox || Ctrl is ComboBox || Ctrl is MaskedTextBox || Ctrl is CheckBox || Ctrl is RadioButton || Ctrl is ListBox || Ctrl is DateTimePicker)
                {
                    if (Ctrl.Visible && Ctrl.Enabled && Ctrl.TabStop)
                    {
                        Ctrl.Focus();
                        e.Handled = true;
                        return;
                    }
                    else
                    {
                        SetFocusOnNextControlKeyDown(container, Ctrl, e);
                    }
                }
                else
                {
                    SetFocusOnNextControlKeyDown(container, Ctrl, e);
                }
            }
            else
            {
                SetFocusOnNextControlKeyDown(container, null, e);
            }
            e.SuppressKeyPress = true;
        }
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (e.KeyCode == Keys.Enter)
            e.SuppressKeyPress = true;
    }
}
Tags:

  • 1
Сомнительная фича времен псевдографических интерфейсов.

P.S. а не лучше проверку нажатой клавиши и типа Control-а делать именно в Form1_KeyDown.

А ты поди заказчику объясни, что это сомнительная фича ... Он платит и требует.

Это отрывок кода из реального решения, где в Form1_KeyDown очень много кода, поэтому сделал переход между контролерами отдельной процедурой, она там из нескольких мест вызывается.

  • 1