Vb.net 显示多条记录

Vb.net 显示多条记录,vb.net,Vb.net,我是新的vb编码只是想帮助显示多个文本框上的多行。上面的代码从另一个表的文本框中提取工资单Id,然后通过下面的表dbo.Smline。我想在不同的文本框中显示同一工资单Id下的多条记录。此代码似乎工作不正常 表单上有三组控件。因此,对于每个单击的Payroll\u id,您最多可以显示三个产品。代码在所有集合中插入相同的值。将代码更改为以下内容: Private Sub Line_Change2() Dim cn As New SqlClient.SqlConnection("xx

我是新的vb编码只是想帮助显示多个文本框上的多行。上面的代码从另一个表的文本框中提取工资单Id,然后通过下面的表
dbo.Smline
。我想在不同的文本框中显示同一工资单Id下的多条记录。此代码似乎工作不正常


表单上有三组控件。因此,对于每个单击的
Payroll\u id
,您最多可以显示三个产品。代码在所有集合中插入相同的值。将代码更改为以下内容:

  Private Sub Line_Change2()
    Dim cn As New SqlClient.SqlConnection("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    Dim cmd As New SqlClient.SqlCommand
    Dim tbl As New DataTable
    Dim da As New SqlClient.SqlDataAdapter
    Dim reader As SqlClient.SqlDataReader
    Try
        cn.Open()
        Dim sql As String
        sql = "select Id,Payroll_Id,ProductCode,Description,Qty from dbo.SmLine where Payroll_Id ='" + Txt1.Text + "'"
        cmd = New SqlClient.SqlCommand(sql, cn)
        reader = cmd.ExecuteReader
        While reader.Read
            TextBox1.Text = reader.Item("Id")
            Cmb1.Text = reader.Item("ProductCode")
            Des1.Text = reader.Item("Description")
            Qty1.Text = reader.Item("Qty")

            TextBox2.Text = reader.Item("Id")
            Cmb2.Text = reader.Item("ProductCode")
            Des2.Text = reader.Item("Description")
            Qty2.Text = reader.Item("Qty")

            TextBox3.Text = reader.Item("Id")
            Cmb3.Text = reader.Item("ProductCode")
            Des3.Text = reader.Item("Description")
            Qty3.Text = reader.Item("Qty")

        End While
        cn.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

当上面的代码对于
工资单id
有三个以上的产品时,就会退出读取,因为您只有三组控件。但是,如果每个单击的
Payroll\u id
可以有三个以上的产品,并且您希望显示所有这些产品,那么您必须动态构建控件

每个
Payroll\u Id
最多有三条记录吗?如果您有三种以上的产品用于
工资单\u Id
,该怎么办?您只构建了三列控件setGood方法,但避免使用
+
运算符进行字符串连接。你甚至可以使用字符串插值
“Cmb”+(counter)
$“Cmb{counter}”@djv这是正确的,但是$-字符串插值是C#6.0的一个特性,我不确定他是否使用C#6或更高版本。我肯定他没有使用C#6。无论如何,我总是假设一个问题适用于最新的框架和编译器,除非另有说明。这是2015年VB 14带来的。他也可以选择
String.Format(“Cmb{0},counter)
或好的ol'
“Cmb”&counter.ToString()
,但是
+
连接字符串是一个大禁忌,我不会说这是一个大禁忌。我知道微软建议使用&vs+,以消除歧义,同时声明两者都可以使用。此线程上有一个很好的比较:。尽管如此,我还是将其更改为&。
&
始终连接字符串<代码>+根据输入有一些模糊性。当
选项Strict On
被添加到代码中时,链接的答案会崩溃,并且您的原始答案也不会用它编译。我想乔尔已经尽力去回答这个问题了,我想知道他在实践中有多少次遵循这个建议+顺便说一句,我对你的回答感到抱歉,我吹毛求疵。(我会在这里删除我的评论,让你的答案简洁明了-祝你有一个好答案!)
 Private Sub Line_Change2()
    ResetControls()
    Dim cn As New SqlClient.SqlConnection("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    Using cn
        cn.Open()
        Dim cmd As New SqlClient.SqlCommand
        Dim reader As SqlClient.SqlDataReader
        Try
            Dim sql As String
            sql = "select Id,Payroll_Id,ProductCode,Description,Qty from dbo.SmLine where Payroll_Id ='" + Txt1.Text + "'"
            cmd = New SqlClient.SqlCommand(sql, cn)
            reader = cmd.ExecuteReader
            Dim counter as Integer = 1
            While reader.Read
                CType(me.Controls.Find("TextBox" + CType(counter,String),False)(0),TextBox).Text = reader.Item("Id").ToString()
                CType(me.Controls.Find("Cmb" + CType(counter,String),False)(0),ComboBox).Text = reader.Item("ProductCode").ToString()
                CType(me.Controls.Find("Des" + CType(counter,String),False)(0),TextBox).Text = reader.Item("Description").ToString()
                CType(me.Controls.Find("Qty" + CType(counter,String),False)(0),TextBox).Text = reader.Item("Qty").ToString()
                counter += 1
                if counter =3 then Exit While
            End While
            reader.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Using
End Sub
Public Sub ResetControls()
    For counter = 1 to 3
        CType(me.Controls.Find("TextBox" + CType(counter,String),False)(0),TextBox).Text = ""
        CType(me.Controls.Find("Cmb" + CType(counter,String),False)(0),ComboBox).Text = ""
        CType(me.Controls.Find("Des" + CType(counter,String),False)(0),TextBox).Text = ""
        CType(me.Controls.Find("Qty" + CType(counter,String),False)(0),TextBox).Text = ""
    Next
End Sub