如何读取DataTable的内容并将其分配给其他控件?

时间:2012-10-11 10:14:09

标签: vb.net

早上好,

我一整夜都试图自己解决这个问题,而不会惹恼别人,但我做不到。

我成功地查询了MySQL数据库,并将一组记录添加到DataTable(dbTable)中。在调试过程中,我可以看到它的内容,所以我知道数据存在。最初,DataTable用于填充我在表单上的ListView控件。

当我选择一条记录时,我希望将DataTable(或我刚刚运行的查询)的内容分配给某些TextBox控件。我似乎无法弄清楚如何做到这一点。任何帮助将不胜感激。

更新添加图片 我希望这些截图能够让我了解我的目标。第一张图显示了输入帐号后发生的情况。第二个框显示扩展的Groupbox,以便在ListView中选择记录后显示表单字段。

控件名称为: TextBoxCustomer,TextBoxLastName,TextBoxFirstName,ComboBoxSalutation,ComboBoxCardType,TextBoxCard.Text,TextBoxExpireMonth,TextBoxExpireYear,TextBoxCVV2。

DataTable(dbTable)中的字段名称为: nameCOMPANY,nameLAST,nameFIRST,nameSALUTATION,ccType,ccNumber,ccExpireMonth,ccExpireYear,ccCode。

图片1: After entry is made in TextBoxAccount.

图片2: After a record is selected in the Listview

2 个答案:

答案 0 :(得分:2)

你试过这个吗?

TextBox1.Text = dbTable.Rows(0)("ColumnName").ToString()
TextBox2.Text = dbTable.Rows(1)("OtherColumnName").ToString()

你也可以这样做:

Dim row as DataRow = dbTable.Rows(0)
TextBox1.Text = row("ColumnName").ToString()

row = dbTable.Rows(1)
TextBox2.Text = row("OtherColumnName").ToString()

您还可以使用DataBind作为DataGrid dbTable DataSource(或类似控件),然后将DataGrid.EditMode设置为True }。这将为您创建文本框控件。

<强>更新

尝试使用类似的方法将文本框绑定到ListView的选定值:

Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    Dim item As ListViewItem = Nothing
    Dim tb As TextBox = Nothing
    Dim i As Integer = 0

    For Each item In ListView1.SelectedItems
        tb = Me.Controls.Find("TextBox" & i.ToString, True)(0)
        If tb IsNot Nothing Then
            tb.Text = item.Text
        End If

        i += 1
    Next
End Sub

<强>更新

这样可以更加防错,但只有当您的文本框命名为TextBox1TextBox2TextBox3等时,此例程才有效:

Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    Dim item As ListViewItem = Nothing
    Dim found() As Control = Nothing
    Dim tb As TextBox = Nothing
    Dim i As Integer = 0

    For Each item In ListView1.SelectedItems
        found = Me.Controls.Find("TextBox" & i.ToString, True)

        If found.Length > 0 Then
            tb = TryCast(found(0), TextBox)
        Else
            tb = Nothing
        End If

        If tb IsNot Nothing Then
            tb.Text = item.Text
        End If

        i += 1
    Next
End Sub

<强>更新

好的,感谢屏幕截图,我假设您的ListView.MultiSelect = False,因此一次只能选择一个项目。鉴于此,只要正确命名了文本框和ListView列,以下内容就可以正常工作:

Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    Dim item As ListViewItem = Nothing
    If ListView1.SelectedItems.Count = 1 Then
        item = ListView1.SelectedItems(0)

        txtCardNumber.Text = item.SubItems("CARD NUMBER")
        txtCardExpirationMonth.Text = item.SubItems("EXP MO")
        txtCardExpirationYear.Text = item.SubItems("EXP YEAR")
    End If
End Sub

答案 1 :(得分:0)

Hello guys / gals,

在Pete的大力协助下,我能够修改建议的答案,并找到了理想的解决方案。为了防止显示水平滚动条,我没有向Listview添加列(来自Designer)。相反,我以编程方式将字段添加到Listview中 - 这样它们可供选择。

我遇到的主要问题是弄清楚字段的索引编号。我不得不多次调试以弄清楚数字是什么 - 所以如果有人知道更好的方法请分享。

以下是我使用的两个代码(感谢Pete):

    Private Sub loadCard()

    Try
        'FOR MySQL DATABASE USE
        Dim dbQuery As String = ""
        Dim dbCmd As New MySqlCommand
        Dim dbAdapter As New MySqlDataAdapter
        Dim dbTable As New DataTable
        Dim i As Integer

        If dbConn.State = ConnectionState.Closed Then
            dbConn.ConnectionString = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password)
            dbConn.Open()
        End If

        dbQuery = "SELECT *" & _
                   "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber " & _
                   "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"
        With dbCmd
            .CommandText = dbQuery
            .Connection = dbConn
        End With
        With dbAdapter
            .SelectCommand = dbCmd
            .Fill(dbTable)
        End With
        ListViewCard.Items.Clear()
        For i = 0 To dbTable.Rows.Count - 1
            With ListViewCard
                .Items.Add(dbTable.Rows(i)("ccID"))
                With .Items(.Items.Count - 1).SubItems
                    .Add(dbTable.Rows(i)("ccNumber"))
                    .Add(dbTable.Rows(i)("ccExpireMonth"))
                    .Add(dbTable.Rows(i)("ccExpireYear"))
                    .Add(dbTable.Rows(i)("ccCode"))
                    .Add(dbTable.Rows(i)("ccType"))
                    .Add(dbTable.Rows(i)("ccAuthorizedUseStart"))
                    .Add(dbTable.Rows(i)("ccAuthorizedUseEnd"))
                    .Add(dbTable.Rows(i)("nameCOMPANY"))
                    .Add(dbTable.Rows(i)("nameSALUTATION"))
                    .Add(dbTable.Rows(i)("nameLAST"))
                    .Add(dbTable.Rows(i)("nameFIRST"))
                End With
            End With
        Next
        If dbTable.Rows.Count = 0 Then
            LabelNoCard.Visible = True
            LabelNoCard.Focus()
            TextBoxAccount.Focus()
            Me.Refresh()
        Else
            If dbTable.Rows.Count > 1 Then
                LabelNoCard.Visible = False
                LabelMultipleCards.Visible = True
                ListViewCard.Visible = True
                Me.Refresh()
            End If
        End If
    Catch ex As MySqlException
        MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _
                    vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.")
    End Try
    dbConn.Close()
End Sub

这是第二个:

    Private Sub ListViewCard_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListViewCard.SelectedIndexChanged

    GroupBox2.Visible = True
    Dim item As ListViewItem = Nothing
    If ListViewCard.SelectedItems.Count = 1 Then
        item = ListViewCard.SelectedItems(0)

        TextBoxCustomer.Text = item.SubItems(8).Text
        TextBoxLastName.Text = item.SubItems(10).Text
        TextBoxFirstName.Text = item.SubItems(11).Text
        ComboBoxSalutation.Text = item.SubItems(9).Text
        ComboBoxCardType.Text = item.SubItems(5).Text
        TextBoxCard.Text = item.SubItems(1).Text
        TextBoxExpireMonth.Text = item.SubItems(2).Text
        TextBoxExpireYear.Text = item.SubItems(3).Text
        TextBoxCVV2.Text = item.SubItems(4).Text
        DateTimePickerStartDate.Text = item.SubItems(6).Text
        DateTimePickerEndDate.Text = item.SubItems(7).Text

    End If
    End Sub