как запрограммировать событие click элемента управления listbox, когда свойство .name неизвестно во время разработки - PullRequest
0 голосов
/ 26 июня 2019

У меня есть приложение, которое имеет несколько форм.На одной из этих форм у меня есть пустой элемент управления вкладками.Во время выполнения пользователь вводит строку в текстовое поле.Эта строка используется для создания новой вкладки с использованием этой строки в качестве ее свойства .text, а также на этой новой вкладке создается список со свойством .name и тем же именем, что и строка, введенная пользователем.

Итак, начинается с пустой tabcontrol. Пользователь вводит строку. Новая вкладка создается со строкой в ​​качестве имени. Создается новый список и новый список со строкой в ​​качестве их имен.

Затем мастер запускает и задает вопросы пользователю, ответык которому сохраняются в массив строк, а затем объединяются в одну длинную строку, которая добавляется в поле списка.

У меня есть вкладки, список и элементы списка, сохраненные при выходе и замененные при загрузке.

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

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

Итак, допустим, это было "Такси". У меня есть вкладка на control с именем Taxi tabcontrol1.tabpage.item (0) = "Такси" и контроллер списка на этой вкладке со свойством .name Такси, поэтому Taxi.item (0) будет первым элементом списка в такси, который является элементом управления списком

Но так как я программно создал эти свойства .name во время выполнения, как теперь я могу обратиться к свойству listbox.name, чтобы написать код за событием click члена элемента списка?

'industry is the user inputted string
        TabControl1.TabPages.Add(industry)
        TabControl1.Refresh()
        TabControl1.SelectedTab = TabControl1.TabPages.Item(industry)
        TabControl1.Parent = Me.ActiveControl.Parent
        Dim newListbox As New System.Windows.Forms.ListBox
        Dim locationpoint As Point
        newListbox.Parent = TabControl1.SelectedTab
        newListbox.Width = 1154
        newListbox.Height = 498
        locationpoint.X = 0
        locationpoint.Y = 0
        newListbox.Location = locationpoint
        newListbox.Name = industry
        newListbox.BorderStyle = BorderStyle.Fixed3D
        newListbox.CreateControl()
        Dim counttabs = TabControl1.TabCount
        TabControl1.SelectedIndex = counttabs
        Me.TabControl1.SelectTab(counttabs - 1)
        TabControl1.SelectedTab.Controls.Add(newListbox)
        newListbox.Dock = DockStyle.Top
        TabControl1.SelectTab(industry)

Ответы [ 2 ]

0 голосов
/ 29 июня 2019
AddHandler newListbox.SelectedIndexChange, AddressOf Me.ListIndexChanged
Private Sub ListIndexChanged(sender As Object, e As EventArgs) 
Dim currentListBox as ListBox = DirectCast(sender, ListBox) 
Dim clickedText = currentListBox.GetItemText(currentListBox.SelectedItem) 
End Sub. 

Добавление этого кода в мой, как представлено в моем вопросе, сделало то, что мне нужно было сделать, я также (в соответствии с инструкциями) удалил строку, которая назначала элемент управления вкладкой в ​​качестве родительского элемента списка, и удалил строку о создании элемента управления listbox.Правильный ответ был представлен Джими, хотя у Криса мог быть другой способ сделать это ... Я просто не мог понять это.

0 голосов
/ 26 июня 2019

Вот пример, который создает элементы управления ListBox во время выполнения и связывает их событие MouseClick, используя AddHandler. Один и тот же обработчик событий используется для всех элементов управления. Аргумент sender используется для получения ListBox, по которому щелкнули, а затем для отображения его имени. Вам нужно будет создать форму Windows с одной кнопкой с именем Button1.

Public Class Form1

    Private yPos As Integer = 50
    Private listBoxNumber As Integer = 1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'Create the ListBox
        Dim lb As New ListBox()

        'Set properties
        lb.Location = New Point(50, yPos)
        lb.Height = 25
        lb.Width = 100
        lb.Name = $"ListBox{listBoxNumber}"

        'Wire up the Event Handler
        AddHandler lb.MouseClick, AddressOf ListBox_MouseClick

        'Add to the Form
        Me.Controls.Add(lb)

        'Update yPos and list box Number
        yPos += 30
        listBoxNumber += 1

    End Sub

    Private Sub ListBox_MouseClick(sender As Object, e As MouseEventArgs)

        'Get the ListBox that was clicked from the sender argument
        Dim lb As ListBox = DirectCast(sender, ListBox)

        'Display its name
        MessageBox.Show($"ListBox with name ""{lb.Name}"" was clicked!")

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        'Search for controls with a specific name.  
        'This returns an array
        Dim controlsFound = Me.Controls.Find("ListBox2", False)

        If (controlsFound.Any()) Then
            Dim lb As ListBox = DirectCast(controlsFound(0), ListBox)

            MessageBox.Show("Found the control!")

            'Get the selected Items or whatever here


        Else
            MessageBox.Show("Control not found.")
        End If
    End Sub

End Class
...