Frage zu DataGridView

06/11/2008 - 13:13 von Christoph Michalski | Report spam
Hallo,
ich habe folgendes Problem:
ein DataGridView-Steuerelement ist an eine DataView gebunden, der User kann
Äderungen in DataGridView vornehmen. Beim Verlassen eines Feldes wird in
einem CellLeave-Ereignis geprüft, ob Änderungen vorgenommen wurden. Wenn ja
dann wird der Text in roter , wenn nein in schwarz Schrfit dargestellet:

Dim Row As DataRow = TestDataView(e.RowIndex).Row
TestDataGridView.EndEdit()
With Row
.EndEdit()
If .Item(e.ColumnIndex, DataRowVersion.Original) <> .Item
(e.ColumnIndex, DataRowVersion.Current) Then
TestDataGridView.CurrentCell.Style.ForeColor = Color.Red
Else
TestDataGridView.CurrentCell.CurrentCell.Style.ForeColor =
Color.Black
End If
TestDataGridView.EndEdit()
.EndEdit()
End With


Es funktioniert Alles wunderbar, nur wenn ich anschließend per Mausklick auf
einen ColumHeader eine der Spalten neu sortiere, werden alle Felder wieder in
schwarzer Schrift angezeigt. Ich kann mir dies nicht erklàren. Weiß jemand
was ich da falsch mache?

Gruß
Christoph
 

Lesen sie die antworten

#1 Peter Götz
07/11/2008 - 12:30 | Warnen spam
Hallo Christop,

ein DataGridView-Steuerelement ist an eine DataView
gebunden, der User kann Äderungen in DataGridView
vornehmen. Beim Verlassen eines Feldes wird in einem
CellLeave-Ereignis geprüft, ob Änderungen vorgenommen
wurden. Wenn ja dann wird der Text in roter , wenn nein in
schwarz Schrfit dargestellet:



Feste Farbvorgaben sind immer problematisch, da es viele
Benutzer mit bestimmten Farbsehschwàchen gibt, deren
Auswirkung man als Programmierer nicht vorhersehen
kann. Farbeinstellung überlàsst man besser dem Anwender
selbst.


Dim Row As DataRow = TestDataView(e.RowIndex).Row
TestDataGridView.EndEdit()
With Row
.EndEdit()
If .Item(e.ColumnIndex, DataRowVersion.Original) <> .Item
(e.ColumnIndex, DataRowVersion.Current) Then
TestDataGridView.CurrentCell.Style.ForeColor = Color.Red
Else
TestDataGridView.CurrentCell.CurrentCell.Style.ForeColor
Color.Black
End If
TestDataGridView.EndEdit()
.EndEdit()
End With


Es funktioniert Alles wunderbar, nur wenn ich anschließend per
Mausklick auf einen ColumHeader eine der Spalten neu sortiere,



... dann bekommt die .CurrentRow und damit auch die
.CurrentCell Werte aus einer anderen DataRow zugewiesen.


werden alle Felder wieder in schwarzer Schrift angezeigt.



Die CurrentCell behàlt eigentlich schon ihre Farbe, aber
sie hat nicht mehr den Inhalt, wie er vor dem Neusortieren
war.

Ich kann mir dies nicht erklàren. Weiß jemand
was ich da falsch mache?



Eine farbl. Markierung der DGV.CurrentRow ist für
Dein Vorhaben ungeeignet, da sich der Inhalt der
jeweiligen CurrentRow mit jeder Neusortierung àndert.

Du kannst aber die DataRow.RowError-Eigenschaft
nutzen, um einen geànderten Datensatz im RowHeader
des DGV zu markieren.

Private Sub DGV_CellValidated _
(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs _
) Handles DGV.CellValidated

Dim i As Integer
Dim DR As DataRow
Dim RowIndex As Integer = e.RowIndex
Dim ColIndex As Integer = e.ColumnIndex
Dim OrgValue As Object
Dim CurrValue As Object
DR = mDV.Item(RowIndex).Row

Select Case DR.RowState
Case DataRowState.Detached, DataRowState.Added
' neuer Datensatz
DR.RowError = "Neu"

Case Else
' sonstige Datensàtze
mDV.Item(RowIndex).EndEdit()

For i = 0 To mDT.Columns.Count - 1
OrgValue = DR.Item(i, DataRowVersion.Original)
CurrValue = DR.Item(i, DataRowVersion.Current)

If OrgValue.Equals(CurrValue) Then
DR.RowError = ""
Else
DR.RowError = "Geàndert"
Exit For
End If
Next
End Select
End Sub

Weicht der Inhalt eines Feldes im Datensatz vom ursprünglichen
Originalwert ab, so wird damit im RowHeader der betr. DGV-Zeile
ein Ausrufezeichen angezeigt. Im DGV neu hinzugefügte Zeile
werden ebenso markiert. Wird der Mauszeiger auf eines dieser
Ausrufezeichen bewegt, erscheint ein TooltipText "Neu" oder
"Geàndert".

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen