Answered by:
Winforms Datagrid - Doppelklick - Zeilen Daten

Question
-
Hallo,
ich würde gerne mit einem Doppelklick auf ein Datagrid ein Detail Fenster öffnen.
Ich weiß wie ich die Parameter übergeben kann, jedoch muss ich die ID aus der angeklickten Zeile lesen um die Daten für das Detail Fenster abzufragen.
Daher habe ich nun die Frage wie ich im Doppelklick Event die angeklickte Zeile lesen kann?
Vielen Dank.
Answers
-
Hallo,
hier ein Auszug aus einem meiner Programme. Mit rechts click Maus auf eine Zelle im Datagridview die entsprechenden Zeilendaten herausholen.
( 2 Versionen )
Gruss Ellen
1. Eine Version mit mousedown event
''' <summary> ''' rechte mousetaste holt eine row mit allen Daten ''' </summary> ''' <param name="sender"></param> ''' <param name="e">System.Windows.Forms.MouseEventArgs</param> ''' <remarks>Handles DataGridView1.MouseDown</remarks> Private Sub DataGridView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown Dim lMouseEventArgs As MouseEventArgs = DirectCast(e, MouseEventArgs) Dim hti As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(e.X, e.Y) If lMouseEventArgs.Button = Windows.Forms.MouseButtons.Right Then If hti.Type = DataGridViewHitTestType.Cell Then ' User right clicked a row that is not selected, so throw away all other selections and select this row Me.DataGridView1.ClearSelection() Me.DataGridView1.Rows(hti.RowIndex).Selected = True Dim selectedRow As DataGridViewRow = DataGridView1.Rows(hti.RowIndex) Dim cells As DataGridViewCellCollection = selectedRow.Cells Me.currentSelectedRowIndex = hti.RowIndex Me.currentColname = Me.DataGridView1.Columns(hti.ColumnIndex).HeaderText ' Daten aus dem Grid nehmen und nicht aus der dahinterliegenden datatable ' wegen Sortierfunktion! ' Me.currentPid = CType(cells.Item("KNR").Value, String) Me.currentTestresid = CType(cells.Item("TESTRESID").Value, String) Me.currentPlace = CType(cells.Item("PLACE").Value, String) Me.currentStationnr = CType(cells.Item("MFT").Value, String) Me.currentProdata = CType(cells.Item("PRODATA").Value, String) Dim obj2 As Object = cells.Item(hti.ColumnIndex).Value If Not TypeOf obj2 Is System.DBNull Then CurrentCell = CType(obj, String) Me.currentTesttime = CType(cells.Item("TESTTIME").Value, DateTime) 'status3.Text = ">c" & count.ToString & " row" & hti.RowIndex & " col" & hti.ColumnIndex & " cell:" & CurrentCell End If
''' <summary> ''' mouse doppelclick auf eine Zelle ''' </summary> ''' <param name="sender"></param> ''' <param name="e">System.Windows.Forms.DataGridViewCellMouseEventArgs</param> ''' <remarks>DataGridView1.CellMouseDoubleClick</remarks> Private Sub DataGridView1_CellMouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick Dim cRow As Integer = e.RowIndex Dim cCol As Integer = e.ColumnIndex Dim colName As String = DataGridView1.Columns(cCol).HeaderText Dim cell As DataGridViewCell Dim item As String = String.Empty If cRow >= 0 Then ' -1 bei header cell Dim selectedRow As DataGridViewRow = DataGridView1.Rows(cRow) Dim cells As DataGridViewCellCollection = selectedRow.Cells Me.currentSelectedRowIndex = cRow ' Daten aus dem Grid nehmen und nicht aus der dahinterliegenden datatable ' wegen Sortierfunktion! ' currentPid = CType(cells.Item("KNR").Value, String) currentTestresid = CType(cells.Item("TESTRESID").Value, String) currentPlace = CType(cells.Item("PLACE").Value, String) currentStationnr = CType(cells.Item("MFT").Value, String) currentProdata = CType(cells.Item("PRODATA").Value, String) Dim obj2 As Object = cells.Item(cCol).Value ' ' auch geklickte cell lesen ' If Not TypeOf obj2 Is System.DBNull Then CurrentCell = CType(obj, String) currentTesttime = CType(cells.Item("TESTTIME").Value, DateTime) 'status3.Text = "cell click: item-" & currentPid & " Rowindex-" & cRow & " Colindex-" & cCol DataGridView1.ClearSelection() End If End Sub
2. Version mit CellMouseDoubleClick event
VB2008 Express, VB2010 Express, VST2008 professional Ellens Codegallerie
- Edited by Ellen Ramcke Saturday, August 18, 2012 2:36 PM
- Marked as answer by Dragonalw Monday, August 20, 2012 8:47 AM
-
Ich lös das immer mit folgendem Code
Private Sub DGV_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellDoubleClick Try If e.ColumnIndex > -1 Then If e.RowIndex > -1 Then MsgBox(CInt(Me.DGV.Rows(e.RowIndex).Cells("ID").Value)) End If Catch ex As Exception MessageBox.Show(ex.Message, "Fehler beim Auswählen", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
Die Überprüfung der beiden Index >-1 ist wichtig, wenn der User nicht eine Celle erwischt!
Beste Grüße
David- Marked as answer by Dragonalw Monday, August 20, 2012 8:47 AM
All replies
-
Hallo,
verwende die SelectedRow-Eigenschaft. Mehr dazu
Gewusst wie: Abrufen der ausgewählten Zellen, Zeilen und Spalten im DataGridView-Steuerelement in Windows FormsGruß Elmar
-
Hallo,
danke, damit bekomme ich den Index, aber wie komme ich an den Inhalt der Zeilen bzw. Spalten?
Tut mir leid fange in Sachen Winforms gerade erst an.
Ich bekomme meine Daten über einen OData Webservice, den ich mit Lightswitch erstellt habe. Deswegen ist das ganze noch ein bisschen komplizierter.
Gibt es vielleicht auch Tutorials in Zusammenhang mit Odata bzw. Webservices und Winforms?
Vielen Dank.
-
Hallo,
hier ein Auszug aus einem meiner Programme. Mit rechts click Maus auf eine Zelle im Datagridview die entsprechenden Zeilendaten herausholen.
( 2 Versionen )
Gruss Ellen
1. Eine Version mit mousedown event
''' <summary> ''' rechte mousetaste holt eine row mit allen Daten ''' </summary> ''' <param name="sender"></param> ''' <param name="e">System.Windows.Forms.MouseEventArgs</param> ''' <remarks>Handles DataGridView1.MouseDown</remarks> Private Sub DataGridView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown Dim lMouseEventArgs As MouseEventArgs = DirectCast(e, MouseEventArgs) Dim hti As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(e.X, e.Y) If lMouseEventArgs.Button = Windows.Forms.MouseButtons.Right Then If hti.Type = DataGridViewHitTestType.Cell Then ' User right clicked a row that is not selected, so throw away all other selections and select this row Me.DataGridView1.ClearSelection() Me.DataGridView1.Rows(hti.RowIndex).Selected = True Dim selectedRow As DataGridViewRow = DataGridView1.Rows(hti.RowIndex) Dim cells As DataGridViewCellCollection = selectedRow.Cells Me.currentSelectedRowIndex = hti.RowIndex Me.currentColname = Me.DataGridView1.Columns(hti.ColumnIndex).HeaderText ' Daten aus dem Grid nehmen und nicht aus der dahinterliegenden datatable ' wegen Sortierfunktion! ' Me.currentPid = CType(cells.Item("KNR").Value, String) Me.currentTestresid = CType(cells.Item("TESTRESID").Value, String) Me.currentPlace = CType(cells.Item("PLACE").Value, String) Me.currentStationnr = CType(cells.Item("MFT").Value, String) Me.currentProdata = CType(cells.Item("PRODATA").Value, String) Dim obj2 As Object = cells.Item(hti.ColumnIndex).Value If Not TypeOf obj2 Is System.DBNull Then CurrentCell = CType(obj, String) Me.currentTesttime = CType(cells.Item("TESTTIME").Value, DateTime) 'status3.Text = ">c" & count.ToString & " row" & hti.RowIndex & " col" & hti.ColumnIndex & " cell:" & CurrentCell End If
''' <summary> ''' mouse doppelclick auf eine Zelle ''' </summary> ''' <param name="sender"></param> ''' <param name="e">System.Windows.Forms.DataGridViewCellMouseEventArgs</param> ''' <remarks>DataGridView1.CellMouseDoubleClick</remarks> Private Sub DataGridView1_CellMouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick Dim cRow As Integer = e.RowIndex Dim cCol As Integer = e.ColumnIndex Dim colName As String = DataGridView1.Columns(cCol).HeaderText Dim cell As DataGridViewCell Dim item As String = String.Empty If cRow >= 0 Then ' -1 bei header cell Dim selectedRow As DataGridViewRow = DataGridView1.Rows(cRow) Dim cells As DataGridViewCellCollection = selectedRow.Cells Me.currentSelectedRowIndex = cRow ' Daten aus dem Grid nehmen und nicht aus der dahinterliegenden datatable ' wegen Sortierfunktion! ' currentPid = CType(cells.Item("KNR").Value, String) currentTestresid = CType(cells.Item("TESTRESID").Value, String) currentPlace = CType(cells.Item("PLACE").Value, String) currentStationnr = CType(cells.Item("MFT").Value, String) currentProdata = CType(cells.Item("PRODATA").Value, String) Dim obj2 As Object = cells.Item(cCol).Value ' ' auch geklickte cell lesen ' If Not TypeOf obj2 Is System.DBNull Then CurrentCell = CType(obj, String) currentTesttime = CType(cells.Item("TESTTIME").Value, DateTime) 'status3.Text = "cell click: item-" & currentPid & " Rowindex-" & cRow & " Colindex-" & cCol DataGridView1.ClearSelection() End If End Sub
2. Version mit CellMouseDoubleClick event
VB2008 Express, VB2010 Express, VST2008 professional Ellens Codegallerie
- Edited by Ellen Ramcke Saturday, August 18, 2012 2:36 PM
- Marked as answer by Dragonalw Monday, August 20, 2012 8:47 AM
-
Ich lös das immer mit folgendem Code
Private Sub DGV_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellDoubleClick Try If e.ColumnIndex > -1 Then If e.RowIndex > -1 Then MsgBox(CInt(Me.DGV.Rows(e.RowIndex).Cells("ID").Value)) End If Catch ex As Exception MessageBox.Show(ex.Message, "Fehler beim Auswählen", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
Die Überprüfung der beiden Index >-1 ist wichtig, wenn der User nicht eine Celle erwischt!
Beste Grüße
David- Marked as answer by Dragonalw Monday, August 20, 2012 8:47 AM