当.name 属性在设计时未知时,如何为列表框控件的单击事件编程

Posted

技术标签:

【中文标题】当.name 属性在设计时未知时,如何为列表框控件的单击事件编程【英文标题】:how to program for a click event of a listbox control when the .name property is unknown at design time 【发布时间】:2019-06-26 12:45:32 【问题描述】:

我有一个有多种形式的应用程序。 在其中一个表单上,我有一个空的选项卡控件。 在运行时,用户在文本框中输入一个字符串。 该字符串用于创建一个使用该字符串作为其 .text 属性的新选项卡 此外,在该新选项卡上创建了一个列表框,其 .name 属性也与用户输入的字符串同名。

所以从空的 tabcontrol 开始 用户输入字符串 以字符串为名称创建新选项卡 创建了新的列表框,并以字符串为名称的新列表。

然后一个向导启动并向用户提问,其答案存储在一个字符串数组中,然后连接成一个长字符串,添加到列表框中。

我在退出时保存选项卡、列表框和列表项,并在加载时替换。

现在,当用户双击列表框项时,我想显示一个对话框,使用列表中的字符串来显示数据。

但是,这是我的问题: 每个选项卡和列表都有一个 .name 属性,该属性由用户在该文本框中输入的任何内容分配。

所以可以说它是“出租车” 我在名为 Taxi tabcontrol1.tabpage.item(0) = "Taxi" 的控件上有一个选项卡 以及该选项卡上带有 Taxi .name 属性的列表框控件 所以 Taxi.item(0) 将是 Taxi 中的第一个列表项,它是一个列表框控件

但由于我在运行时以编程方式创建了这些 .name 属性, 我现在如何处理 listbox.name 属性以在列表框的项目成员的单击事件后面编写代码?

'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)

【问题讨论】:

您需要使用AddHandler 语句为您的ListBox 添加点击事件处理程序。在您的处理程序中,sender 参数是被点击的ListBox 对我来说这比 vb 更希腊化 你能用代码向我描述一下吗? 我想我有点明白了。我将为列表框的单击事件创建一个处理程序,并以某种方式告诉该处理程序处理选项卡上的任何列表框? 在阅读之后...看起来如果我按照你的建议做,如果我理解语法,我必须使用指向列表框的句柄子句,问题是我当用户单击或理想情况下双击列表框中的项目时,我无法以任何方式解决我知道该列表框的列表项。现在它是taxi.items(0) 但它可能是dentity.items(0) 我无法知道用户将如何命名选项卡并最终命名列表框的listbox.name 属性放置在运行时的选项卡。 【参考方案1】:

这是一个在运行时创建ListBox 控件并使用AddHandler 连接其MouseClick 事件的示例。相同的事件处理程序用于所有控件。 sender 参数用于获取被点击的ListBox,然后显示它的名称。您需要创建一个带有一个名为 Button1 的按钮的 Windows 窗体。

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 = $"ListBoxlistBoxNumber"

        '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

【讨论】:

我会研究一下,看看我能理解和实施什么。 在阅读代码时,我有几个问题: 1.这是否只是为了完成单击列表框上的任意位置并让 msgbox 告诉我控件的名称?这就是我正在阅读此代码的目的。如果我错了,请告诉我。这不是我想要完成的。如果是这样的话,我可以更容易地找到列表框控件的名称。虽然我在这里阅读的内容可能完全关闭......我需要能够单击列表控件中的特定项目并让它返回被单击的项目。我确定我可以编码。 问题是如果控件的名称是动态的,我似乎无法弄清楚如何处理该列表框。我希望我很清楚,如果你的回答实现了这个目标,那么我的道歉似乎并不是它所做的。在我看来,当在任何地方单击列表框时,您的代码会返回列表框 .name 属性......是这样吗? 我的意思是最终我希望解决被单击或双击的列表框的项目成员,但能够访问控件本身就足够了,我可以与它的成员一起工作参考一下。 以前在我的应用程序中,在将列表成员保存到注册表或在 frm 加载时检索的函数中,我能够像这样引用列表 For Each ctrl As Control In TabControl1.TabPages.Item( 0).Controls If TypeOf ctrl Is ListBox Then If DirectCast(ctrl, ListBox).Name = industry Then End If 但那是我想将字符串变量的名称分配给选项卡并且列表被命名为注册表。那时的变量名是已知的......“行业”。在下一次运行中,行业是“”,并保存用户在运行时输入的字符串变量。【参考方案2】:
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. 

按照我的问题中提出的那样将该代码添加到我的代码中完成了我需要完成的任务 我还(按照指示)删除了将选项卡控件分配为列表父级的行,并删除了有关创建列表框控件的行 正确答案是由 Jimi 提交的,尽管 Chris 可能有另一种方法来完成这个……我就是想不通。

【讨论】:

以上是关于当.name 属性在设计时未知时,如何为列表框控件的单击事件编程的主要内容,如果未能解决你的问题,请参考以下文章

如何为创建大量实例节省内存?

VB列表框属性的问题

当 EditText 控件的 inputType 为数字时,如何为其设置文本

StatusBar控件的简介

如何为 RadioButton 赋值

VC++列表框控件问题!会的进来下