Как найти текст нажатой кнопки в одном утверждении? - PullRequest
0 голосов
/ 10 ноября 2018

Итак, в основном, я программирую эту виртуальную клавиатуру, и мне приходится писать код отдельно для каждой клавиши, то есть кнопок.
Это смехотворно утомительно, и мне было интересно, было ли хотя бы одно утверждение, которое могло бы найти текст нажатой клавиши (Button).

Мой текущий код такой:

textbox.TextBox1.Text = textbox.TextBox1.Text + zh.Text

zh - это имя Button для контекста.

Теперь я должен копировать и вставлять эту строку кода снова и снова в каждом событии Click Button.
Я думаю, что есть способ заставить код захватить текст того, что Button я нажимаю, а затем отправить этот текст в TextBox.

Если это действительно возможно, кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 10 ноября 2018

Метод 1 :
Используя конструктор, назначьте одно событие Click всем вашим кнопкам, затем используйте объект sender, приведя его к кнопке или элементу управления:

Private Sub MyKeys_Click(sender As Object, e As EventArgs) Handles MyKeysA.Click, MyKeysB.Click, (...)
    TextBox1.AppendText(CType(sender, Button).Text)
End Sub

Но к обработчику финальных событий будет прикреплено множество ссылок на кнопки. Не красавица.

Метод 2 :
Создайте обработчик событий в коде и назначьте его всем вашим кнопкам с помощью classic делегата с
AddHandler [Event], AddressOf [HandlerMethodName]

Предположим, что ваши кнопки имеют общее частичное имя, здесь "btnKey".
Вы также можете использовать свойство Tag и назначить ему определенные значения для кнопок клавиш.
Затем вы должны написать Where(): b.Tag.ToString().Contains("[Some Common Identifier]").

Обратите внимание, что значение свойства Tag имеет тип object, поэтому Contains() это просто общий пример. Это может оценить Integer введите или что-нибудь еще.

Примечание 1: Чтобы назначить общий идентификатор всем кнопкам клавиш, вы можете использовать конструктор * 1044: выберите все кнопки и используйте Properties Window, чтобы изменить свойство Tag все выбранные кнопки.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("btnKey"))
        AddHandler btn.Click, AddressOf Me.MyKeys_Click
    Next
End Sub

Private Sub MyKeys_Click(sender As Object, e As EventArgs)
    TextBox1.AppendText(DirectCast(sender, Control).Text)
End Sub

Примечание 2 :
Как предложил Эндрю Мортон в комментариях, здесь приведение приведено с использованием оператора DirectCast () . Поскольку sender равно a Button, а также Button является производным от Control, вы можете использовать легкий DirectCast() до см. sender как Button или Control (так как Button происходит от Control, а свойство Text наследуется от Control) и имеет доступ к его свойству .Text.

Из документов:
[DirectCast()] (...) может обеспечить несколько лучшую производительность, чем CType при преобразовании в тип данных Object и из него.

Я ухожу CType () в первом примере в качестве визуального помощника.

Разница между DirectCast () и CType () в VB.NET

Метод 3 :
Создайте обработчик событий в коде и назначьте его всем вашим кнопкам, используя лямбду в качестве делегата метода:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("btnKey"))
        AddHandler btn.Click, Sub() TextBox1.AppendText(btn.Text)
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...