0

おはようございます、

私は他の誰にも邪魔されずに自分でこれを理解しようと一晩中起きていましたが、できません.

MySQL データベースのクエリに成功し、一連のレコードを DataTable (dbTable) に取得しました。デバッグ中にその内容を見ることができるので、データがそこにあることがわかります。最初に、DataTable を使用して、フォームにある ListView コントロールを設定します。

レコードを選択するときに、DataTable (または実行したばかりのクエリ) の内容をいくつかの TextBox コントロールに割り当てる必要があります。これを行う方法がわかりません。どんな助けでも大歓迎です。

画像を追加するための更新: これらのスクリーンショットが、私が何をしようとしているのかを理解してくれることを願っています。最初の画像は、アカウント番号が入力された後に何が起こるかを示しています。2 番目のボックスは、ListView でレコードが選択された後にフォーム フィールドを表示するために展開された Groupbox を示しています。

コントロール名は 、TextBoxCustomer、TextBoxLastName、TextBoxFirstName、ComboBoxSalutation、ComboBoxCardType、TextBoxCard.Text、TextBoxExpireMonth、TextBoxExpireYear、TextBoxCVV2 です。

DataTable (dbTable) のフィールド名は、 nameCOMPANY、nameLAST、nameFIRST、nameSALUTATION、ccType、ccNumber、ccExpireMonth、ccExpireYear、ccCode です。

画像 1: TextBoxAccountに入力後。

画像 2: リストビューでレコードが選択された後

4

2 に答える 2

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

としてを使用しDataBindDataGrid(または同様のコントロール)に設定し、をに設定することもできます。これにより、テキストボックスコントロールが作成されます。dbTableDataSourceDataGrid.EditModeTrue

アップデート:

次のような方法で、テキストボックスを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

アップデート:

これはもう少しエラー防止ですが、このルーチンは、テキストボックスに、、、などの名前が付けられている場合にのみ機能TextBox1TextBox2ますTextBox3

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、一度に1つのアイテムしか選択できません。その場合、テキストボックスと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
于 2012-10-11T10:20:10.417 に答える
0

こんにちは。

Pete の多大な支援により、提案された回答を修正することができ、目的の解決策を達成することができました。水平スクロールバーが表示されないようにするために、(デザイナーから) Listview に列を追加しませんでした。代わりに、プログラムでリストビューにフィールドを追加しました。このようにして、フィールドを選択できるようにしました。

私が遭遇した主な問題は、フィールドのインデックス番号を把握することでした。数字が何であるかを把握するために何度かデバッグする必要がありました - 誰かがより良い方法を知っているなら、共有してください.

私が使用した2つのコードは次のとおりです(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

これが2番目のものです:

    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
于 2012-10-11T17:14:37.680 に答える