Как я могу ссылаться на элемент управления из метода элемента управления (например, «я» для классов)? - PullRequest
1 голос
/ 28 декабря 2010

Как я могу обратиться к элементу управления, когда я нахожусь внутри метода элемента управления в VB.NET?

Например, я хочу, чтобы в текстовом поле при каждом изменении текста отображалось окно сообщения с текстом этого текстового поля. Код будет что-то вроде:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

msgbox("The text is:"+ Me.text)    

' ok the line above wont work i already know that, because "Me" refer to the form,
' not the control textbox1
' how i will refer to the textbox1's text???
' i dont want to use "textbox1.text" is there a way similar like the "Me" is for forms?
' because i want to copy-paste a code like this in a lot of controls and do not want to
' have to change in every copy the name to each control name

End Sub

Надеюсь, я ясно дал понять; мой английский нуждается в улучшении: D

Ответы [ 2 ]

4 голосов
/ 28 декабря 2010

Нет, нет ключевого слова, которое позволяет вам сделать это. Однако каждое событие, вызванное элементом управления, передает параметр sender, который можно использовать для определения того, какой конкретный элемент управления вызвал это событие.

Обратите внимание, что этот параметр всегда вводится как базовый Object (поскольку он может представлять любой возможный элемент управления), поэтому вам нужно будет перейти к более конкретному классу элемента управления, если вам нужен доступ к любому из уникальных членов, которые это разоблачает. Поскольку вы обрабатываете событие, вызванное элементом управления TextBox, вы знаете, что sender должен иметь тип TextBox, поэтому вы можете просто использовать DirectCast справиться с апскейтингом. Вам не нужно беспокоиться о том, что InvalidCastException будет брошено.

Например, ваш приведенный выше пример будет выглядеть так:

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
    Dim textBox As TextBox = DirectCast(sender, TextBox)
    MessageBox.Show("The text is: " & textBox.Text)
End Sub


Тем не менее, в вашем вопросе на меня бросается пара вещей:
  1. Каждый раз, когда ваш подход к решению проблемы заключается в «копировании» кода, вы должны остановиться, сделать шаг назад и попытаться выяснить, есть ли лучший способ достичь вашей конечной цели.

    Например, если вам нужно, чтобы каждое текстовое поле в вашей форме реагировало одинаково при возникновении определенного события, вам следует рассмотреть возможность создания подкласса существующего элемента управления TextBox и консолидации всего кода в одно место. Помните, что вы можете наследовать большинство стандартных элементов управления для добавления пользовательских функций. Часто это гораздо лучшее решение, чем копирование и вставка кода в несколько мест в вашем проекте. Если вам когда-нибудь понадобится отследить ошибку или изменить эту функциональность, вам нужно будет изменить ее только в одном месте кода, а не в нескольких. В качестве некоторого более дерзкого преимущества вы сможете использовать Me для ссылки на этот элемент управления при редактировании его подкласса.

  2. Вы должны всегда предпочитать объединять (объединять) строки, используя оператор & в VB.NET, а не знак +. Или, может быть, даже лучше, методы String.Concat или String.Format.

  3. Нет причин использовать MsgBox в VB.NET, в отличие от MessageBox.Show. Нет, это не улучшит производительность вашего приложения, но это хорошая практика для языков .NET.

0 голосов
/ 28 декабря 2010

Переменная отправителя содержит экземпляр TextBox, к которому вы хотите получить доступ. Вам нужно только преобразовать отправителя в TextBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...