VB WindowsForm Пользовательский класс событий обработчик проблемы - PullRequest
0 голосов
/ 26 октября 2019

Я создал пользовательский класс (DataGroupBoxControl), который в основном представляет собой GroupBox с одной или несколькими панелями внутри. Каждая панель имеет две метки рядом, как показано ниже. введите описание изображения здесь

Объект позволяет передавать в него DataTable, который определяет, сколько строк панелей создается и отображается. Я бы хотел, чтобы пользователь мог щелкнуть одну из надписей на панели и сделать «что-нибудь».

Вот процедура внутри класса, который создает надписи.

Public Class DataGroupBoxControl
Inherits GroupBox

Public DataLabels As New List(Of DataLabelControl)

Public Sub BindData(ByVal ds As DataTable)
    Dim colItem As Integer = 0
    For Each col As DataColumn In ds.Columns
        DataLabels.Add(New DataLabelControl)
        For Each row As DataRow In ds.Rows
            DataLabels(colItem).TitleLabel.Text = col.ColumnName & " " & _Separator
            DataLabels(colItem).TitleLabel.Name = col.ColumnName
            If IsNumeric(row.Item(colItem)) Then
                If row.Item(colItem).ToString.IndexOf(".") <> -1 Then
                    DataLabels(colItem).ValueLabel.Text = Decimal.Parse(row.Item(colItem)).ToString("c")
                Else
                    DataLabels(colItem).ValueLabel.Text = row.Item(colItem)
                End If
            End If
            DataLabels(colItem).ValueLabel.Name = row.Item(colItem)
            DataLabels(colItem).Top = (colItem * DataLabels(colItem).Height) + 20
            DataLabels(colItem).Left = 5
            Me.Controls.Add(DataLabels(colItem))
            Me.Height = Me.Height + DataLabels(colItem).Height
            DataLabels(colItem).Show()
        Next
        colItem += 1
    Next
End Sub

Гдеи как мне создать обработчик события Label Click? И затем получить доступ к этому событию из моей основной формы с помощью следующего объекта:

Public AccountsGroupBox As New DataGroupBoxControl

1 Ответ

0 голосов
/ 26 октября 2019

Перед созданием DataLabelControl используйте AddHandler для присоединения обработчика событий, например. в элемент управления TitleLabel, вы можете прослушивать события и вызывать новые события, которые можно обрабатывать в родительском элементе управления.

Public Class SomeForm
    Private WithEvents AccountsGroupBox As New DataGroupBoxControl

    Private Sub AccountsGroupBox_ItemClick(
              sender As Object, 
              args As ItemClickEventArgs) Handles AccountsGroupBox.ItemClick

    End Sub
End Class

Public Class ItemClickEventArgs
    Inherits EventArgs
    Public Property Control As Object
End Class

Public Class DataGroupBoxControl
    Inherits GroupBox

    Public Event ItemClick(sender As Object, args As ItemClickEventArgs)

    Public DataLabels As New List(Of DataLabelControl)

    Private Sub OnLabelClick(sender As Object, args As EventArgs)
        RaiseEvent ItemClick(Me, New ItemClickEventArgs With {.Control = object})
    End Sub

    Public Sub BindData(ByVal ds As DataTable)

        For Each col As DataColumn In ds.Columns

            Dim control = New DataLabelControl
            AddHandler control.TitleLabel.Click, AddressOf OnLabelClick

            DataLabels.Add(control)

            ' ...
        Next
    End Sub
End Class
...