Не удается установить фокус на текстовое поле Windows Forms

#vb.net #winforms

#vb.net #winforms

Вопрос:

Кажется, я не могу сфокусировать ввод на текстовом поле при первом появлении страницы вкладки (я использую Windows Forms, VB.NET 3.5).

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

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

Если это имеет значение, макет страницы вкладки немного сложный:

 frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1
  

Я хочу установить фокус на TextBox1.

  1. Каков наилучший способ сфокусироваться на желаемом текстовом поле?
  2. Если настройка фокуса — лучший способ, почему текстовое поле.Сбой метода Focus ()?

Ответ №1:

Я бы предположил, что вы пытаетесь установить фокус в обработчике события загрузки формы? Если это так, вам нужно выполнить Me.Show() для фактического создания экранных элементов управления, прежде чем можно будет установить фокус. Что-то вроде:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Me.Show()
    Application.DoEvents()
    TextBox1.Focus()
End Sub
  

Если вы не выполните Me.Show() , форма НЕ будет отображаться до завершения события загрузки.

Для элемента управления tab обработайте _SelectedIndexChanged событие:

 Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As System.EventArgs) _
  Handles TabControl1.SelectedIndexChanged

    If TabControl1.SelectedTab.Name = "TabPage1" Then
        TextBox2.Focus()
    End If
    If TabControl1.SelectedTab.Name = "TabPage2" Then
        TextBox4.Focus()
    End If
  

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

Комментарии:

1. Я пытаюсь установить фокус в событии ввода страницы вкладки, думая, что событие ввода относится к странице вкладки, как событие загрузки к форме, т. Е. это то, где вы инициализируете вещи.

2. Вы хотите обработать событие _SelectedIndexChanged:

3. Да, установка фокуса в обработчике событий TabControl1_SelectedIndexChanged решила проблему. Спасибо за вашу помощь.

4. Вы также можете сделать это в обработчике для Me.Shown

Ответ №2:

Попробуйте либо:

 Me.ActiveControl = TextBox1
  

или

 TextBox1.Select()
  

Комментарии:

1. Когда я делаю первое, я не вижу никакого эффекта на пользовательский интерфейс; когда я запрашиваю Me.ActiveControl в отладчике, он выводит TextBox1, поэтому я предполагаю, что TextBox1 является активным элементом управления, но он не помещает курсор в текстовое поле.

2. Когда я выполняю второе (TextBox1.Select(0,0)), ничего не происходит.

3. Извините, попробуйте TextBox1.Select()

4. TextBox1.Select () также не имеет эффекта. Я забыл, что использую. Выберите () другие места в моем приложении, чтобы установить фокус на текстовое поле, и это работает нормально. Я предполагаю, что в этой конкретной ситуации есть что-то, что мешает этому текстовому полю сфокусироваться.

Ответ №3:

Выполните control.Focus() в OnShown событии. Вам не нужна какая-либо логика DoEvents, которая у меня все равно не работала.

Ответ №4:

Вы должны использовать Selected событие TabControl

 Private Sub TabControl1_Selected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected
    If e.TabPage.Name = "TabPage1" Then
        TextBox1.Select()
    End If
End Sub
  

Как я проверил, в обоих TabControl.Selected и TabPage.Enter Event можно установить Select TextBox . Я думаю, что некоторые другие элементы крадут фокус. пожалуйста, измените

Комментарии:

1. Я решил проблему, установив фокус в TabControl1. Выбран обработчик события indexchanged. Спасибо за вашу помощь.

Ответ №5:

Ни одно из решений, которые я нашел в Интернете, не решает проблему, когда элемент управления находится на странице вкладки.

Однако это работает:

(1) установите для TabIndex элемента управления значение 0.

(2) В вашем коде, который обрабатывает событие tabpage, выполните следующее:

 SendKeys.Send("{TAB}")
  

Если SendKeys не кажется допустимым статментом, убедитесь, что у вас есть следующий импорт в верхней части вашего файла кода:

 Imports System.Windows.Forms
  

Ответ №6:

Я обнаружил, что TabControl получает фокус при завершении выбранного события. Чтобы это сработало, я использовал событие Paint страницы TabPage для установки фокуса нужного объекта.

 Private Sub TabChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tab1.Paint, Tab2.Paint, Tab3.Paint

    Select Case sender.Name
        Case "Tab1"
            Textbox1.Focus()
        Case "Tab2"
            T3extbox2.Focus()
        Case "Tab3"
            Textbox3.Focus()
    End Select

End Sub
  

Ответ №7:

Попробуйте Activated событие формы, подобное этому:

 Private Sub Form2_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    'SendKeys.Send("{TAB}") this line works too
    TextBox1.Focus()
End Sub
  

Это гарантированно сработает.

Ответ №8:

У меня однажды была такая же проблема, но я решил ее с помощью Me.activate() функции.

Ответ №9:

Вы бы попробовали это?

             Me.Activate()
            TextBox1.Focus()
            TextBox1.SelectAll()
  

Комментарии:

1. дополнительная информация улучшила бы этот ответ