2010-12-28 2 views
1

Как я могу ссылаться на элемент управления, пока я внутри метода элемента управления в 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

+0

Я пробовал искать «MyBase, Parent, Me», но я не нашел ничего, что саморефлексирует для элементов управления ... :( –

ответ

4

Нет, нет ключевого слова, которое позволит вам это сделать. Однако каждое событие, поднятое элементом управления, проходит в параметре 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. В VB.NET нет причин использовать MsgBox, в отличие от MessageBox.Show. Нет, это не улучшит производительность вашего приложения, но это хорошая практика для работы на языках .NET.

+0

вы спасли день сэр !!! Большое спасибо !!! –

+0

+1 Хотя я бы также рассмотрел [поставщиков расширителей] (http://msdn.microsoft.com/en-us/library/d6c1xa43.aspx), а не подклассифицировал TextBox. – MarkJ

+0

@MarkJ: Конечно, в зависимости от конкретной потребности. чувствовал, что я уже немного зашел в тупик. ;-) –

0

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

+0

Благодарим вас за ответ и Марсель! –

Смежные вопросы