2017-02-21 20 views
0

У меня есть форма с ~ 40 различными текстовыми полями. Недавно они попросили меня добавить функциональность, чтобы они могли запускать отчет, когда они нажимают кнопку ввода (вместо нажатия кнопки). Итак, я пытаюсь создать общий обработчик событий в своей форме, чтобы поймать событие, поднятое в различных элементах управления (вместо того, чтобы привязывать обработчик к управлению, который я создаю). У меня код работает, но событие не похоже на основную форму. Не могли бы вы указать, где я чего-то не хватает?Как пузырить события из класса элементов управления в родительскую форму

Public Class TextboxSelect 
    Inherits System.Windows.Forms.TextBox 
    Public Sub New() 
     AddHandler Enter, AddressOf selectText 
     AddHandler KeyDown, AddressOf raiseEnterEvent 
    End Sub 

    Public Event enterPressed As EventHandler 
    Private Sub selectText(sender As Object, e As EventArgs) 
     Dim text As TextboxSelect = CType(sender, TextboxSelect) 
     text.SelectionStart = 0 
     text.SelectionLength = text.Text.Length + 1 
    End Sub 

    Public Sub raiseEnterEvent(sender As Object, e As KeyEventArgs) 
     RaiseEvent enterPressed(Me, New EventArgs) 
     If (e.KeyCode = Keys.Enter) Then 
      RaiseEvent enterPressed(Me, New EventArgs) 
     End If 
    End Sub End Class 

Главная форма:

Private Sub textboxEnterSearch(sender As Object, e As EventArgs) Handles this.enterPressed 
    MessageBox.Show("You hit enter in a textbox!") 
End Sub 

При отладке, я поднимала событие enterPressed, но мне кажется, что это событие не продувают до формы.

+1

Если вы установите кнопку как 'AcceptButton' вашего' form', то при нажатии кнопки 'Enter' на любом из ваших' управления TextBox', код этой кнопки будет запущена. Используя эту функцию, кажется, вам не нужно писать какой-либо код для ввода ключа Enter, не так ли? –

+1

Что такое 'this'? Вы должны добавить обработчик событий ко всем текстовым полям. –

+0

@RezaAghaei теоретически, мне не нужен код в классе textboxSelect, если бы я это сделал, но разве он не запустил бы его, если бы пользователь нажал клавишу ввода, когда они не были в текстовом поле? – Rolan

ответ

0

Я кончался добавление обработчика в разделе загрузки формы:

Dim cv = GetAllControls(Me).OfType(Of TextboxSelect) 
     For Each obj In cv 
      Dim bob As TextboxSelect = CType(obj, TextboxSelect) 
      AddHandler bob.KeyDown, AddressOf enterBox 
     Next 

Вот функция ссылки в коде:

Private Function GetAllControls(container As Control) As IEnumerable(Of Control) 
    Dim controlList As New List(Of Control)() 
    For Each c As Control In container.Controls 
     controlList.AddRange(GetAllControls(c)) 
     If TypeOf c Is TextBox Then 
      controlList.Add(c) 
     End If 
    Next 
    Return controlList 
End Function 

Затем в обработчике я назвал разные функции на основе соглашения об именах (который, чем kfully, был последовательным).

Код для выбора дифференцирующие различных элементов управления:

Private Sub enterBox(ByVal sender As Object, ByVal e As KeyEventArgs) 

    If e.KeyCode = Keys.Enter Then 
     If CType(sender, TextboxSelect).Name Like "*Cmd1*" Then 
      Cmd1_Click(sender, e) 
     Else 
      Cmd2Search_Click(sender, e) 
     End If 
    End If 
End Sub 
1

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

В дизайнере укажите KeyPreview имущество вашей формы на True. Затем обработайте событие form_KeyDown и проверьте там, если был нажат ключ Enter. Свойство KeyPreview вашей формы запускает ключевые события сначала на форме, а затем на любой элемент управления, на котором он был нажат.

+0

Итак, как бы я мог различать событие, поднятое формой, и одно поднятое текстовым полем?Я не хочу, чтобы это вызывало, если событие не происходит из текстового поля. – Rolan

+0

Если ваши текстовые поля находятся непосредственно над вашей формой, вы можете проверить свойство «Me.ActiveControl», чтобы узнать, какой элемент управления имеет фокус –

1

Чтобы проверить, кто вызвал событие -

If TypeOf ActiveControl Is TextBox Then 
    ....