Donnerstag, Mai 12, 2005

SelectedRows in C1TrueDBGrid

Folgendes Problem:

Wenn man in einem C1TrueDBGrid herumklickt, dann wird die Zeile zwar durch den MarqueeStyle (HighlightRow) zwar hervorgehoben, jedoch nicht in die SelectedRows-Collection aufgenommen. Selber bin ich nicht auf eine perfekte Lösung des Problems gekommen, bis ich diesen Artikel fand:

Newsgroup Article Component1.public.net.tdbgrid:4769

Ich musste ihn etwas abwandeln, da er keine Tastaturnavigation berücksichtigte. Also MarqueeStyle auf NoMarquee stellen und folgenden Code einfügen:



Private Sub TDBPersonenAdressen_SelChange(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.CancelEventArgs) Handles TDBPersonenAdressen.SelChange
' UpdateButttons()
e.Cancel = True
End Sub

Private Sub TDBPersonenAdressen_RowColChange(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.RowColChangeEventArgs) Handles TDBPersonenAdressen.RowColChange
Dim aRow As Integer
Dim aSelectedRow As Integer

Try
aSelectedRow = TDBPersonenAdressen.Row ' TDBPersonenAdressen.RowContaining(e.Y)
If e.LastRow <> aSelectedRow Then

If (Control.ModifierKeys And Keys.Control) > 0 Then
If TDBPersonenAdressen.SelectedRows.IndexOf(aSelectedRow) > -1 Then
If TDBPersonenAdressen.SelectedRows.Count > 1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aSelectedRow))
End If
Else
TDBPersonenAdressen.SelectedRows.Add(aSelectedRow)
End If
Else
If (Control.ModifierKeys And Keys.Shift) > 0 Then
For aRow = (TDBPersonenAdressen.SelectedRows.Count - 1) To 1 Step -1
TDBPersonenAdressen.SelectedRows.RemoveAt(aRow)
Next

If TDBPersonenAdressen.SelectedRows.Count > 0 Then
If TDBPersonenAdressen.SelectedRows(0) > aSelectedRow Then
For aRow = TDBPersonenAdressen.SelectedRows(0) To aSelectedRow Step -1
If TDBPersonenAdressen.SelectedRows.IndexOf(aRow) > -1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aRow))
End If

TDBPersonenAdressen.SelectedRows.Add(aRow)
Next
Else
For aRow = TDBPersonenAdressen.SelectedRows(0) To aSelectedRow
If TDBPersonenAdressen.SelectedRows.IndexOf(aRow) > -1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aRow))
End If

TDBPersonenAdressen.SelectedRows.Add(aRow)
Next
End If
End If
Else
TDBPersonenAdressen.SelectedRows.Clear()
TDBPersonenAdressen.SelectedRows.Add(aSelectedRow)
End If
End If

RaiseEvent SelectionChanged(Me, EventArgs.Empty)
End If
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Sub