none
DataGridView master/detail - Sortierung und Filterung RRS feed

  • Frage

  • Hallo,

    in meiner Form habe ich zwei DGV (ObjektDGV und ObjektDGV2). Das DGV stellt eine Tabelle dar, während im DGV2 (verknüpft über die ID von DGV) alle Details dargestellt werden.

    Nun möchte ich 1., dass nach der Sortierung von DGV wieder die zuvor markierte Zeile ausgewählt und angezeigt wird und 2., dass im DGV2 die Daten gefiltert werden, sodass nur der im DGV ausgewählten Zeile zugehörige Werte dargestellt werden.

    Die Lösungen beider Probleme funktionieren für sich. Nur leider in Kombination nicht - sortiere ich nach einer Spalte, so tritt der Fehler "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." auf.

    Hier mein Code für das SelectionChanged- und das Sorted-Ereignis:

        Private Sub ObjektDGV_SelectionChanged(sender As Object, e As EventArgs) Handles ObjektDGV.SelectionChanged
    
            With ObjektDGV
                If .SelectedRows.Count > 0 AndAlso Not _protectselection Then
                    _selectedrows.Clear()
                    For i As Integer = 0 To .SelectedRows.Count - 1
                        _selectedrows.Add(CInt(.SelectedRows(i).Cells("ObjektID").Value))
                    Next i
                End If
            End With
    
            Dim dv1 = New DataView(DataSet.tblObjekte)
            Try
                dv1.RowFilter = "ZubehoerZuObjekt = " & ObjektDGV.CurrentRow.Cells(0).Value
                ObjektDGV2.DataSource = dv1
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub
    
        Private Sub ObjektDGV_Sorted(sender As Object, e As EventArgs) Handles ObjektDGV.Sorted
            _protectselection = True
            With ObjektDGV
                .ClearSelection()
                If _selectedrows.Count > 0 Then
                    For i As Integer = 0 To .Rows.Count - 1
                        If _selectedrows.Contains(CInt(.Rows(i).Cells("ObjektID").Value)) Then
                            .Rows(i).Selected = True
                            .FirstDisplayedScrollingRowIndex = i
                        End If
                    Next i
                End If
            End With
            _protectselection = False
        End Sub
    Hat jemand eine Idee wo mein Fehler liegt?
    Mittwoch, 9. September 2015 13:33

Antworten

  • Guten Morgen,

    manchmal muss man einfach "eine Nacht drüber schlafen".

    Ich konnte das Problem wie folgt lösen:

        Private Sub ObjektDGV_SelectionChanged(sender As Object, e As EventArgs) Handles ObjektDGV.SelectionChanged
    
            With ObjektDGV
                If .SelectedRows.Count > 0 AndAlso Not _protectselection Then
                    _selectedrow.Clear()
                    For i As Integer = 0 To .SelectedRows.Count - 1
                        _selectedrow.Add(CInt(.SelectedRows(i).Cells("ObjektID").Value))
                    Next i
                End If
            End With
    
            Dim dv1 = New DataView(DataSet.tblObjekt)
            Try
                If ObjektDGV.CurrentRow IsNot Nothing Then
                    dv1.RowFilter = "ZubehoerZuObjekt = " & ObjektDGV.CurrentRow.Cells(0).Value
                    If _currentRow IsNot Nothing Then
                        dv1.RowFilter = "ZubehoerZuObjekt = " & _currentRow
                    End If
                    _currentRow = Nothing
                    ObjektDGV2.DataSource = dv1
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub
    
        Private Sub ObjektDGV_Sorted(sender As Object, e As EventArgs) Handles ObjektDGV.Sorted
            _protectselection = True
            With ObjektDGV
                .ClearSelection()
                If _selectedrow.Count > 0 Then
                    For i As Integer = 0 To .Rows.Count - 1
                        If _selectedrow.Contains(CInt(.Rows(i).Cells("ObjektID").Value)) Then
                            _currentRow = .Rows(i).Cells(0).Value
                            .Rows(i).Selected = True
                            .FirstDisplayedScrollingRowIndex = i
                        End If
                    Next i
                End If
            End With
            _protectselection = False
        End Sub


    Donnerstag, 10. September 2015 07:11