使用button click事件处理程序从另一个函数访问vb.net中的循环中的值

qcbq4gxm  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(350)

我试图创建一个新的pos系统使用vb.net,但我是一个初学者。我有个问题。基本上,我使用一个在线sql数据库,管理员可以使用该数据库为pos添加不同类别的项目。因为所有的项目都存储在一个sql表中,所以我设法根据类别检索这些信息,并在pos系统上以按钮的形式显示它们。
现在的问题是,循环保存了与创建的不同按钮相关的所有信息,当我尝试从另一个按钮访问当前类别的值时,它似乎没有给我当前值,而是给我循环中更新的最后一个值。我在下面留下一个代码示例:

Imports MySql.Data.MySqlClient

Public Class Form13
    Dim arr(100) As String
    Public verifier(1) As Integer
    Dim counter As Integer
    Public value As String

    Public Sub Form13_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim point As Integer
        Dim point1 As Integer
        point = 20
        point1 = 100
        counter = 0
        Label2.Text = Form12.selected_value
        Dim connection As New MySqlConnection
        connection.ConnectionString = ("host=localhost;user=root;password=;database=pos;")
        connection.Open()
        Dim command As New MySqlCommand("select * from categories", connection)
        Dim reader As MySqlDataReader
        reader = command.ExecuteReader

        While reader.Read()
            Dim button As New Button
            value = reader.GetString("category_name")

            button.Name = value
            button.Text = value
            button.Height = 50
            button.Width = 190
            button.Font = New Font("arial", 11)
            button.Location = New Point(point, point1)
            Me.Controls.Add(button)
            point1 = point1 + 50
            counter = counter + 1
            verifier(0) = counter
            arr(counter) = value

            AddHandler button.Click, AddressOf button_Click
            button_Click()
        End While
    End Sub

    Private Sub button_Click()
        MsgBox(arr(counter))
    End Sub
End Class

上面显示的代码是从mysql表中收集类别名称,然后重用一个按钮,直到为mysql表中所有现有类别名称创建了所有按钮。现在,我想要的结果是在按钮处理程序中以msgbox的形式单击相关按钮时获得类别的名称。任何帮助都将不胜感激。
sql表是使用xampp托管的,上面代码中使用的category表的屏幕截图如下所示:在这里输入图像描述

6yjfywim

6yjfywim1#

我使用sql server是因为在那里我有一个示例数据库。只需使用发件人的姓名或文本来查找所单击的类别按钮。

Imports System.Data.SqlClient
Public Class Form3

    Public Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim value As String
        Dim point As Integer
        Dim point1 As Integer
        point = 20
        point1 = 100
        Label2.Text = Form12.selected_value
        Using connection As New SqlConnection
            connection.ConnectionString = My.Settings.BuildersConnectio
            Dim command As New SqlCommand("select * from Builders", connection)
            Dim reader As SqlDataReader
            connection.Open()
            reader = command.ExecuteReader
            While reader.Read()
                Dim button As New Button
                value = reader.GetString(1)
                button.Name = value
                button.Text = value
                button.Height = 50
                button.Width = 190
                button.Font = New Font("arial", 11)
                button.Location = New Point(point, point1)
                Me.Controls.Add(button)
                point1 = point1 + 50
                AddHandler button.Click, AddressOf button_Click
            End While
        End Using
    End Sub

    Private Sub button_Click(sender As Object, e As EventArgs)
        Dim btn As Button = CType(sender, Button)
        Dim ProductCategory = btn.Name
        MessageBox.Show(ProductCategory)
    End Sub
End Class
2vuwiymt

2vuwiymt2#

问题是,你有一个 String value 是一个被引用的对象。循环的每次迭代都会向字符串添加相同的引用。引用告诉程序在哪里查找ram中的值。同一对象的值在每次迭代中都会更新,因此每个条目都有相同的数据。
您可以通过声明 Public value as String 在循环中。每次创建新引用时都是这样。
删除此行:

Public value As String

更改此行:

value = reader.GetString("category_name")

收件人:

Dim value as String = reader.GetString("category_name")

相关问题