Ich möchte die Farbe einer bestimmten Zeile in meiner Datagrid-Ansicht ändern. Die Zeile sollte in Rot geändert werden, wenn der Wert von Spaltenzelle 7 kleiner als der Wert in Spaltenzelle 10 ist. Gibt es Vorschläge, wie dies erreicht werden kann?
143
Ich habe gerade dieses Problem untersucht (daher weiß ich, dass diese Frage vor fast 3 Jahren veröffentlicht wurde, aber vielleicht hilft sie jemandem ...), aber es scheint, dass eine bessere Option darin besteht, den Code in das
RowPrePaint
Ereignis einzufügen, damit Sie dies nicht tun müssen jede Zeile durchlaufen, nur diejenigen, die gemalt werden (damit es bei großen Datenmengen viel besser funktioniert:An die Veranstaltung anhängen
Der Ereigniscode
quelle
Sie suchen die
CellFormatting
Veranstaltung.Hier ist ein Beispiel.
quelle
Ich hatte auch Probleme, die Textfarbe zu ändern - ich habe nie gesehen, wie sich die Farbe geändert hat.
Bis ich den Code hinzugefügt habe, um die Textfarbe des Ereignisses
DataBindingsComplete
für zu ändernDataGridView
. Danach hat es funktioniert.Ich hoffe, dies wird Menschen helfen, die vor dem gleichen Problem stehen.
quelle
So etwas wie das Folgende ... vorausgesetzt, die Werte in den Zellen sind Ganzzahlen.
ungetestet, entschuldigt sich also für etwaige Fehler.
Wenn Sie die bestimmte Zeile kennen, können Sie die Iteration überspringen:
quelle
Einige Leute mögen die verwenden
Paint
,CellPainting
oderCellFormatting
Ereignisse, aber beachten Sie, dass Sie einen Stil in diesen Ereignissen zu ändern verursacht rekursive Aufrufe. Wenn Sie es verwendenDataBindingComplete
, wird es nur einmal ausgeführt. Das Argument dafürCellFormatting
ist, dass es nur für sichtbare Zellen aufgerufen wird, sodass Sie nicht sichtbare Zellen nicht formatieren müssen, sondern sie mehrmals formatieren.quelle
Sie können
Backcolor
Zeile für Zeile unter Verwendung Ihrer Bedingung und dieses Funktionsaufrufs nach dem AnwendenDatasource
von ändernDatagridView
.Hier ist die Funktion dafür. Kopieren Sie das einfach und legen Sie es danach
Databind
quelle
quelle
Dies ist meine Lösung, um die Farbe mit bindingDataSource in dataGridView zu ändern:
quelle
Wenn Sie an eine (Sammlung) konkreter Objekte binden, können Sie dieses konkrete Objekt über die DataBoundItem-Eigenschaft der Zeile abrufen. (Um zu vermeiden, dass in der Zelle nach magischen Zeichenfolgen gesucht wird und "echte" Eigenschaften des Objekts verwendet werden)
Skelettbeispiel unten:
DTO / POCO
Bindung an die Datagrid-Ansicht
dann die Ereignisbehandlungsroutine und das Abrufen des konkreten Objekts (anstelle einer DataGridRow und / oder von Zellen)
quelle
Normalerweise verwende ich dafür gerne das Ereignis GridView.RowDataBound.
quelle
Funktioniert mit Visual Studio 2010. (Ich habe es versucht und es funktioniert!) Es wird Ihre gesamte Zeile malen.
datagridview
.CellClick
Ereignis und fügen Sie die nächste Codezeile ein.quelle
Sie haben nicht erwähnt, wie sich der Wert ändert. Ich habe ähnliche Funktionen verwendet, wenn der Benutzer einen Wert eingibt. dh Aufrufen und Verlassen des Bearbeitungsmodus.
Verwenden des CellEndEdit- Ereignisses von datagridview.
Sie können auf ähnliche Weise eine Logik zum Löschen der Fehlerbenachrichtigung hinzufügen.
Wenn in Ihrem Fall Daten programmgesteuert geladen werden, kann das CellLeave- Ereignis mit demselben Code verwendet werden.
quelle
Mit diesem Code ändern Sie nur die Zeilenrückfarbe, wenn der Spaltennamenwert Null ist. Die Farbe anderer Zeilen ist immer noch die Standardfarbe.
quelle
Nur ein Hinweis zur Einstellung
DefaultCellStyle.BackColor
... Sie können nur einen transparenten Wert festlegenColor.Empty
. Das ist der Standardwert. Das impliziert fälschlicherweise (jedenfalls für mich), dass transparente Farben in Ordnung sind. Sie sind nicht. Jede Zeile, die ich auf eine transparente Farbe eingestellt habe, zeichnet nur die Farbe der ausgewählten Zeilen.Ich habe viel zu viel Zeit damit verbracht, meinen Kopf wegen dieses Problems gegen die Wand zu schlagen.
quelle
Ich bin hier gelandet und habe nach einer Lösung für den Fall gesucht, dass ich keine Datenbindung verwende. Nichts hat bei mir funktioniert, aber ich habe es am Ende bekommen mit:
quelle
Wenn Sie der zweitdümmste Entwickler auf dem Planeten sind (ich bin der dümmste), scheinen alle oben genannten Lösungen zu funktionieren: CellFormatting, DataSourceChanged und RowPrePaint. Ich bevorzuge RowPrePaint.
Ich hatte Probleme damit (viel zu lange), weil ich meine SelectionBackColor und SelectionForeColor anstelle von BackColor und ForeColor überschreiben musste, als ich die ausgewählte Zeile änderte.
quelle
quelle