【问题标题】:Adding two column values to listbox in vb.net将两列值添加到 vb.net 中的列表框
【发布时间】:2013-03-16 07:21:20
【问题描述】:

我有一个名为 users 的表,其中包含以下列

User_id,user_name,user_pwd,First_Name,Middle_Name,Last_Name and user_type.

我有一个名为 dst 的数据集,并在数据集中创建了一个名为 user 的表。现在我想用表用户中每一行的user_NameFirst_NameLast_name 填充列表框。

我可以一次添加一个列值,但不知道如何将每行的多个列值添加到列表框

Dim dt As DataTable = Dst.Tables("user")

For Each row As DataRow In dt.Rows
    lstUsers.Items.Add(row("User_Name"))
Next

以上代码完美运行,但我还想同时将 First_name 和 last_name 添加到列表框中。

【问题讨论】:

  • 您是否尝试在ListBox 中有 3 列?
  • 不是三列只有单列,而是必须具有表用户的所有三列值
  • 你想这样添加。? user_Name1, First_Name1, Last_name1,user_Name2, First_Name2, Last_name2
  • 你试过lstUsers.Items.Add(row("User_Name") + ", " + row("First_Name") + ", " + row("LastName"))或类似的东西吗?请注意,我建议先构建字符串,以防DataRow 中的一列为空。

标签: vb.net


【解决方案1】:

使用与您相同的方法,但将所需的所有值放在一个字符串中。

Dim dt As DataTable = Dst.Tables("user")

For Each row As DataRow In dt.Rows
    Dim sItemTemp as String
    sItemTemp = String.Format("{0},{1},{2}", row("User_Name"), row("First_Name"), row("Last_Name"))
    lstUsers.Items.Add(sItemTemp)
Next

String.Format() 函数将对所有参数调用 .ToString()

在这种情况下,如果row(ColumnName)NULL value,那么.ToString() 只返回空字符串

【讨论】:

    【解决方案2】:

    你有两个选择:

    1. 使用列表框:

    要使用 ListBox,请将字体设置为像 courier new 一样的固定宽度(以便列对齐),然后添加如下所示的项目:

    For Each row As DataRow In dt.Rows
        lstUsers.Items.Add(RPAD(row("User_Name"),16) & RPAD(row("First_Name"),16) & RPAD(row("Last_Name"),16))
    Next
    

    RPAD 函数定义如下:

    Function RPAD(a As Object, LENGTH As Object) As String
        Dim X As Object
        X = Len(a)
        If (X >= LENGTH) Then
            RPAD = a : Exit Function
        End If
        RPAD = a & Space(LENGTH - X)
    End Function
    

    根据您的情况调整 LENGTH 参数。为至少一个空间再添加一个。此解决方案不太理想,因为您必须对列宽进行硬编码。

    1. 使用 DataGridView 控件而不是 ListBox。这确实是最好的选择,如果您需要,您甚至可以通过设置选择整行的选项并将 CellBorderStyle 设置为 SingleHorizo​​ntal 使其表现得像 ListBox。在设计器中定义列,但无需设置宽度 - 列可以自动调整大小,我在下面的代码中设置了该选项。如果您仍然喜欢设置宽度,请注释掉 AutoSizeColumnsMode 行。

    设置网格和添加行的代码如下所示:

        g.Rows.Clear() ' some of the below options are also cleared, so we set them again
        g.AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells
        g.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal
        g.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        g.AllowUserToAddRows = False
        g.AllowUserToDeleteRows = False
        g.AllowUserToOrderColumns = True
        For Each row As DataRow In dt.Rows
            g.Rows.Add(row("User_Name"), row("First_Name"), row("Last_Name"))
        Next
    

    【讨论】:

      【解决方案3】:

      您现在可能已经解决了您的问题,但像我这样的其他用户可能会遇到问题。
      上面给出的答案甚至对我有用,但我根据我想要的简单方式找到了相同的答案..

      cmd = New SqlCommand("select User_Name, First_Name, Last_Name from User")
        Dim dr As SqlDataReader = cmd.ExecuteReader(YourConnectionString)
      
        If dr.HasRows Then
              Do While dr.Read
                              lst.Items.Add(dr.Item(0).ToString & " " & dr.Item(1).ToString & " " & dr.Item(2).ToString)
              Loop
        End If
      

      这对我有用,可能是错误的方式,但我发现它很简单:)

      【讨论】:

        【解决方案4】:

        我可以建议您使用 ListView 控件而不是 Listbox 吗?

        如果您进行切换,这里有一个示例子例程,您可以使用它来填充您说想要的数据。以你喜欢的方式调整它;有很大的改进空间,但您大致了解:

        Public Sub FillUserListView(lstUsers As ListView, Dst As DataSet)
        
            Dim columnsWanted As List(Of String) = New List(Of String)({"User_Name", "First_Name", "Last_Name"})
            Dim dt As DataTable = Dst.Tables("user")
            Dim columns As Integer = 0
            Dim totalColumns = 0
            Dim rows As Integer = dt.Rows.Count
        
            'Set the column titles
            For Each column As DataColumn In dt.Columns
                If columnsWanted.Contains(column.ColumnName) Then
                    lstUsers.Columns.Add(column.ColumnName)
                    columns = columns + 1
                End If
                totalColumns = totalColumns + 1
            Next
        
            Dim rowObjects(columns - 1) As ListViewItem
            Dim actualColumn As Integer = 0
        
            'Load up the rows of actual data into the ListView
            For row = 0 To rows - 1
                For column = 0 To totalColumns - 1
                    If columnsWanted.Contains(dt.Columns(column).ColumnName) Then
        
                        If actualColumn = 0 Then
                            rowObjects(row) = New ListViewItem()
                            rowObjects(row).SubItems(actualColumn).Text = dt.Rows(row).Item(actualColumn)
        
                        Else
                            rowObjects(row).SubItems.Add(dt.Rows(row).Item(actualColumn))
                        End If
        
                        lstUsers.Columns.Item(actualColumn).Width = -2  'Set auto-width
        
                        actualColumn = actualColumn + 1
                    End If
                Next
        
                lstUsers.Items.Add(rowObjects(row))
            Next
        
            lstUsers.View = View.Details 'Causes each item to appear on a separate line arranged in columns
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          • 1970-01-01
          • 2016-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多