1

2 つのフォームがあり、2 つのフォームのそれぞれにDataGridView(chatformprodetail) があります。

で、各行にが生成されたchatformを作成しました。DataGridViewButton

Buttonクリックするたびにprodetailフォームが読み込まれ、フォーム内で元のからprodetailの値を取得したい。SelectedRow.CellDataGridViewchatform

コード ( chatform):

Public Sub loadtoDGV()
    Dim sqlq As String = "SELECT * FROM chattbl"
    Dim sqlcmd As New SqlCommand
    Dim sqladpt As New SqlDataAdapter
    Dim tbl As New DataTable

    With sqlcmd
        .CommandText = sqlq
        .Connection = conn
    End With

    With sqladpt
        .SelectCommand = sqlcmd
        .Fill(tbl)
    End With

    DataGridView1.Rows.Clear()
    For i = 0 To tbl.Rows.Count - 1
        With DataGridView1
            .Rows.Add(tbl.Rows(i)("Username"), tbl.Rows(i)("Title"), tbl.Rows(i)("ChatDateTime"))
        End With
    Next
    conn.Close()
End Sub

Private Sub ChatForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    loadtoDGV()
End Sub

コード ( DataGridView1.CellContentClick):

Private Sub grdData_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Dim colName As String = DataGridView1.Columns(e.ColumnIndex).Name
    If colName = "Detail" Then
        Prodetail.Show()
        MessageBox.Show(String.Format("You clicked the button in row {0} of the Detail column", e.RowIndex))
    End If
End Sub

コード ( prodetail):

Public Sub loadtoDGV2()

    Dim i As Integer
    i = ChatForm.DataGridView1.SelectedRows.Count
    MsgBox(i)

    Dim compareai As String = ChatForm.DataGridView1.SelectedRows(i).Cells(1).Value
    Dim sqlq As String = "SELECT * FROM Chattbl WHERE Title =" & compareai & ""
    Dim sqlcmd As New SqlCommand
    Dim sqladpt As New SqlDataAdapter
    Dim tbl As New DataTable

    With sqlcmd
        .CommandText = sqlq
        .Connection = conn
    End With

    With sqladpt
        .SelectCommand = sqlcmd
        .Fill(tbl)
    End With

    DataGridView1.Rows.Clear()
    For i = 0 To tbl.Rows.Count - 1
        With DataGridView1
            .Rows.Add(tbl.Rows(i)("Username"), tbl.Rows(i)("Title"), tbl.Rows(i)("ChatDateTime"), tbl.Rows(i)("ChatContent"))
        End With
    Next
    conn.Close()
End Sub

Private Sub Prodetail_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    loadtoDGV2()
End Sub

私は何を間違えましたか?

MsgBox(i) i = SelectedRow(0)最初の行のデータが表示されると仮定して使用しようとしましたが、データベースからデータをロードDataGridView1prodetailません。

エラーは見られませんでしたが、解決策がありません。

4

1 に答える 1

1

最初の問題は、インスタンスではなくクラスを呼び出していることです。VB.NETでは、フォームのインスタンスをその名前として呼び出すことができますが、使用するたびに同じインスタンスになります。私はこれを行うことをお勧めしません。

まず、これを変更します。

Private Sub grdData_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Dim colName As String = DataGridView1.Columns(e.ColumnIndex).Name
    If colName = "Detail" Then
        Prodetail.Show()
        MessageBox.Show(String.Format("You clicked the button in row {0} of the Detail column", e.RowIndex))
    End If
End Sub

これに:

Private Sub grdData_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Dim colName As String = DataGridView1.Columns(e.ColumnIndex).Name
    If colName = "Detail" Then
        Dim newDetailForm as new Proddetail(dataGridView1.Rows(e.RowIndex).Cells(1).Value)
        newDetailForm.show()
        MessageBox.Show(String.Format("You clicked the button in row {0} of the Detail column", e.RowIndex))
    End If
End Sub

次に、Proddetailクラスに次のようなコンストラクターとメンバーを追加する必要があります。

Private SearchValue as String 

Public Sub New(byval theSearchValue as string)
    InitalizeComponent()

    SearchValue = theSearchValue
End Sub

次に、ロードルーチンで:

Public Sub loadtoDGV2()      
    Dim sqlq As String = "SELECT * FROM Chattbl WHERE Title =" & SearchValue & ""
    Dim sqlcmd As New SqlCommand
    Dim sqladpt As New SqlDataAdapter
    Dim tbl As New DataTable

    With sqlcmd
        .CommandText = sqlq
        .Connection = conn
    End With

    With sqladpt
        .SelectCommand = sqlcmd
        .Fill(tbl)
    End With

    DataGridView1.Rows.Clear()
    For i = 0 To tbl.Rows.Count - 1
        With DataGridView1
            .Rows.Add(tbl.Rows(i)("Username"), tbl.Rows(i)("Title"), tbl.Rows(i)("ChatDateTime"), tbl.Rows(i)("ChatContent"))
        End With
    Next
    conn.Close()
End Sub

Proddetailこれにより、クラスの新しいインスタンスでクリックされた行の詳細が表示されます。

SQLクエリ文字列の値を取得するカスタムのパラメーター化されたコンストラクターをクラスに追加しましたこのようにして、コードでフォームの新しいインスタンスを作成するときに、表示する詳細につながる検索文字列をいつでも渡すことができます。

于 2013-03-22T15:52:17.713 に答える