Как кодировать с помощью цифровых клавиш c с несколькими текстовыми полями? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь закодировать программу, в которой пользователь видит форму, и в этой форме есть 2 текстовых поля и 10 кнопок.

Username: 
Password: 
1 2 3 
4 5 6
7 8 9
  0

Я пробовал этот код

Private Sub Btn1_Click(sender As Object, e As EventArgs) Handles Btn1.Click
    If UsernameTextbox.Focused = True Then
        UsernameTextbox.Text = UsernameTextbox.Text + "1"
    End If
End Sub

Я понимаю, что нажатие на Btn1 украдет фокус из текстового поля. Так как я могу написать программу?

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Один из вариантов - объявить переменную типа Control и в обработчике событий Leave для каждого элемента управления присвоить sender этой переменной. Затем вы можете использовать эту переменную в обработчике событий Click вашего Button, чтобы определить, какой элемент управления был в фокусе и, возможно, переназначить его обратно, а затем соответствующим образом обновить. Вы можете сделать лот с двумя обработчиками событий, например

Private previouslyActiveTextBox As TextBox

Private Sub TextBoxes_Leave(sender As Object, e As EventArgs) Handles TextBox2.Leave,
                                                                      TextBox1.Leave
    previouslyActiveTextBox = DirectCast(sender, TextBox)
End Sub

Private Sub Buttons_Click(sender As Object, e As EventArgs) Handles Button3.Click,
                                                                    Button2.Click,
                                                                    Button1.Click
    previouslyActiveTextBox.Select()
    previouslyActiveTextBox.SelectedText = CStr(DirectCast(sender, Button).Tag)
End Sub

. Этот код обрабатывает несколько событий одним методом в обоих случаях. Также необходимо назначить номер для каждого Button свойству Tag этого элемента управления. Обратите внимание, что он также устанавливает SelectedText вместо добавления к свойству Text. Это более правильно, потому что он добавит новый текст, где на самом деле расположена каретка, и заменит текст, если он выделен.

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

http://www.vbforums.com/showthread.php?459890-Building-Blocks-for-an-On-screen-Keyboard

0 голосов
/ 03 марта 2020

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

Следующее является проверкой концепции настраиваемой ToolStrip, которая предварительно заполняется кнопками для создания цифровой клавиатуры. как контроль. Элемент управления имеет достаточную функцию для работы по назначению, но не заблокирован для предотвращения неправильного использования путем манипулирования коллекцией Items и другими свойствами.

Public Class NumPadToolstrip : Inherits ToolStrip

  Private _ButtonSize As Size = New Size(50, 50)
  Private _ButtonMargin As Padding = New Padding(5)
  Private _ButtonBackColor As Color = Color.Ivory

  Public Sub New()
    MyBase.New
    LayoutStyle = ToolStripLayoutStyle.Table
    Dim settings As TableLayoutSettings = CType(LayoutSettings, TableLayoutSettings)
    settings.ColumnCount = 3
    settings.RowCount = 4
    AddButtons(7, 9)
    AddButtons(4, 6)
    AddButtons(1, 3)
    AddButtons(0, 0)
    Dock = DockStyle.None
    AutoSize = True
    BackColor = Color.LightGray
  End Sub

  Public Property ButtonSize As Size
    Get
      Return _ButtonSize
    End Get
    Set(value As Size)
      If value <> _ButtonSize Then
        _ButtonSize = value
        UpdateButtonSizes()
      End If
    End Set
  End Property

  Public Property ButtonMargin As Padding
    Get
      Return _ButtonMargin
    End Get
    Set(value As Padding)
      If value <> _ButtonMargin Then
        _ButtonMargin = value
        UpdateMargins()
      End If
    End Set
  End Property

  Public Property ButtonBackColor As Color
    Get
      Return _ButtonBackColor
    End Get
    Set(value As Color)
      If value <> _ButtonBackColor Then
        _ButtonBackColor = value
        UpdateButtonBackColor()
      End If
    End Set
  End Property

  Private Sub AddButtons(start As Int32, [end] As Int32)
    For num As Int32 = start To [end]
      Dim b As New ToolStripButton With {.Text = num.ToString(),
                                         .Size = ButtonSize,
                                         .Margin = ButtonMargin,
                                         .BackColor = ButtonBackColor,
                                         .AutoSize = False}

      AddHandler b.Paint, Sub(sender As Object, e As PaintEventArgs)
                            With e.Graphics
                              Dim r As Rectangle = e.ClipRectangle
                              r.Inflate(-1, -1)
                              r.Location = Point.Empty
                              .DrawRectangle(Pens.Black, r)
                            End With
                          End Sub


      Items.Add(b)
    Next
  End Sub

  Private Sub UpdateButtonSizes()
    SuspendLayout()
    For Each btn As ToolStripButton In Items.OfType(Of ToolStripButton)
      btn.Size = _ButtonSize
    Next
    ResumeLayout()
  End Sub

  Private Sub UpdateMargins()
    SuspendLayout()
    For Each btn As ToolStripButton In Items.OfType(Of ToolStripButton)
      btn.Margin = _ButtonMargin
    Next
    ResumeLayout()
  End Sub

  Private Sub UpdateButtonBackColor()
    SuspendLayout()
    For Each btn As ToolStripButton In Items.OfType(Of ToolStripButton)
      btn.BackColor = _ButtonBackColor
    Next
    ResumeLayout()
  End Sub

End Class

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

Private Sub NumPadToolstrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles NumPadToolstrip1.ItemClicked
  Dim tb As TextBoxBase = TryCast(ActiveControl, TextBoxBase)
  If tb IsNot Nothing Then tb.SelectedText = e.ClickedItem.Text
End Sub
...