none
Winforms Datagrid - Doppelklick - Zeilen Daten RRS feed

  • 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.

    Friday, August 17, 2012 9:28 AM

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
    Saturday, August 18, 2012 6:44 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
    Saturday, August 18, 2012 1:53 PM

All replies

  • 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.

    Friday, August 17, 2012 7:14 PM
  • 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
    Saturday, August 18, 2012 6:44 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
    Saturday, August 18, 2012 1:53 PM