Как программно назначить кнопку по умолчанию?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Как программно назначить кнопку по умолчанию?

Сообщение viter.alex » 10.11.2009 (Вт) 15:44

Мне нужно при нажатии Enter переносить фокус на другую кнопку, чтобы пользователь не нажимал Tab. Не получается! Делаю через AcceptButton, но кнопка не изменяется. Вот, простейший пример:
Код: Выделить всё
Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.AcceptButton = Button2
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Me.AcceptButton = Button1
  End Sub
End Class

По идее, нужно чтобы фокус циклически перемещался с одной кнопки на другую при нажатии Enter
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как программно назначить кнопку по умолчанию?

Сообщение MIT » 10.11.2009 (Вт) 16:16

Можно попробовать так: в событии KeyDown отловить Enter, передать фокус следующему элементу (TabIndex в помощь), после чего обнулить код, что бы Enter не "дошел" до кнопки. Впрочем это только в теории.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как программно назначить кнопку по умолчанию?

Сообщение viter.alex » 10.11.2009 (Вт) 16:25

К.С. Станиславский писал(а):Не верю!

Однако, как все запущено: http://msdn.microsoft.com/ru-ru/library/system.windows.forms.form.acceptbutton.aspx
Кнопка "Принять" может не активироваться, если выбранный в текущий момент элемент управления на форме перехватывает клавишу ВВОД и обрабатывает ее. Например, элемент управления многострочного текстового поля допускает нажатие клавиши ВВОД, если она выбрана для вставки нового строкового символа в элемент управления.

Т.е., если у меня кнопка сейчас активна, то я не могу назначить другую кнопку по умолчанию.
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как программно назначить кнопку по умолчанию?

Сообщение MIT » 10.11.2009 (Вт) 18:17

viter.alex писал(а) что К.С. Станиславский писал(а):Не верю!
Мы здесь не вопросы веры обсуждаем, а программирование, где есть только факты :roll:

Возможно я не понял что тебе надо... Ведь тебе надо по нажатию на Enter перекинуть фокус на следующий контрол? Если да, то такой вариант, пусть он и не очень эстетичен, думаю сойдет:

Наследуем класс кнопки:
Код: Выделить всё
Public Class MyButton
    Inherits System.Windows.Forms.Button

    Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If keyData = 13 Then Return True
        Return MyBase.IsInputKey(keyData)
    End Function
End Class

В коде формы пишем
Код: Выделить всё
    Public Shared Function Recursive(Of T As Control)(ByVal controls As Control.ControlCollection) As IEnumerable(Of T)
        Dim col As New List(Of T)

        For Each c As Control In controls
            Dim ct As T = TryCast(c, T)
            If ct IsNot Nothing Then col.Add(ct)

            For Each cc As T In Recursive(Of T)(c.Controls)
                col.AddRange(cc)
            Next
        Next
        Return col
    End Function

Далее добавляем несколько кнопок на форму и ловим события:
Код: Выделить всё
    Private Sub _KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown, Button2.KeyDown, Button3.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim b As MyButton = DirectCast(sender, MyButton)
            b = (New List(Of Control)(Recursive(Of Control)(b.Parent.Controls))).Find(Function(c As Control) c.TabIndex = b.TabIndex + 1)
            If b IsNot Nothing Then b.Focus()
            e.Handled = True
        End If
    End Sub
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Как программно назначить кнопку по умолчанию?

Сообщение viter.alex » 10.11.2009 (Вт) 20:07

Гм, не знаю, пригодится ли мне это на практике, но в плане теории очень полезно. На день раздумий хватит.
Пусть юзер табом работает. Не развалится
Лучше день потерять — потом за пять минут долететь!

Emzari
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 06.09.2002 (Пт) 9:08
Откуда: Georgia

Re: Как программно назначить кнопку по умолчанию?

Сообщение Emzari » 14.11.2009 (Сб) 12:00

Можно сделать вот так. в собитии KeyUp каждого контролла добавить вот такой код
Код: Выделить всё
If e.KeyCode = Keys.Enter Then
      Me.SelectNextControl(sender, True, False, False, True)
End If

или написать свой обработчик собитии KeyUp и подключать его каждому контроллу


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList