Wie Sie den Wert des DataGridView.SelectedRows().Zellen (), die aus verschiedenen Formen?
Ich habe 2 Formen und in jeweils 2 Formen gibt es eine DataGridView
(chatform
und prodetail
).
In der chatform
ich erstellte eine DataGridView
welche einen generierten Button
in jeder Zeile.
Jeder Button
wenn darauf geklickt wird, laden Sie eine prodetail
form und, wenn in der prodetail
form ich will den Wert der SelectedRow.Cell
von der DataGridView
im Ursprung chatform
.
Code (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
Code (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
Code (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
Was habe ich falsch gemacht?
Habe ich versucht zu verwenden MsgBox(i) i = SelectedRow(0)
vorausgesetzt, es zeigen würde, die Daten für die erste Zeile, aber DataGridView1
im prodetail
lädt nicht alle Daten aus der Datenbank.
Habe ich nicht beobachten können Fehler, ich habe nicht nur eine Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste problem ist, Sie sind dem Aufruf der Klasse statt einer Instanz. VB.NET erlauben Sie rufen Sie eine Instanz von dem Formular seinen Namen, aber es wird die gleiche Instanz über jeden Einsatz. Ich würde nicht empfehlen, dies zu tun.
Beginnen, die ich ändern würde:
Zu diesem:
Dann in der
Proddetail
Klasse müssen Sie einen Konstruktor und einem Mitglied gefällt das:Dann in Ihrem laden routine:
Diese sollten dann zeigen Sie die details der angeklickten Zeile eine neue Instanz des
Proddetail
Klasse.Ich Hinzugefügt eine benutzerdefinierte paramaterized Konstruktor für die Klasse, nimmt der Wert für den SQL-Abfrage-string. Auf diese Weise, wenn Sie erstellen eine neue Instanz der form in Ihrem code, können Sie immer passieren in der such-string, die dazu führen, die details, die Sie anzeigen möchten.
SearchValue
ist, was Sie erwarten, es zu sein. Stellen Sie sicher, dass dietbl
variable wird gefüllt. etc. Der Konstruktor aufgerufen werden soll und erst dann, wenn Sie zeigen die form, dieLoad
werden so genannt, es sei denn, es ist etwas falsch mit SQL haben, sollten Sie etwas sehen.