Hallo allerseits,
ich habe 2 mal ein DataGridView, das per BindingSource mit einer List verbunden ist. Ich will nun im 1. DataGridView Styles verändern, was nicht funktioniert.
for (int loopFarben = 0; loopFarben < Farben.Count; loopFarben++)
{
bool used = false;
for (int loopLeds = 0; loopLeds < Leds.Count; loopLeds++)
{
if (Leds[loopLeds].Ledfarbname == Farben[loopFarben].Farbname) {
used = true;
break;
}
}
if (used)
{
MessageBox.Show(loopFarben.ToString() + ", " + DataGridViewFarben.Rows[loopFarben].Cells[0].Value.ToString());
DataGridViewFarben.Rows[loopFarben].Cells[0].Value = 111;
MessageBox.Show(loopFarben.ToString() + ", " + DataGridViewFarben.Rows[loopFarben].Cells[0].Value.ToString());
DataGridViewFarben.Rows[loopFarben].DefaultCellStyle.Font = new Font(DataGridViewFarben.Font, FontStyle.Bold);
DataGridViewFarben.Rows[loopFarben].DefaultCellStyle.ForeColor = Color.Red;
}
}
Die 1. MessageBox zeigt die richtigen Werte an -> also Lesen funktioniert.
Die 2. MessageBox zeigt die geänderten Werte an -> also Schreiben funktioniert auch.
Die Style-Zuweisungen funktionieren aber nicht. Warum? Was ist falsch?
Du möchtest sicherlich den (aktuellen) DatGridViewCell.Style ändern und nicht den DefaultCellStyle
(Standardzellstil), d.h.
DataGridViewFarben.Rows[loopFarben].Cells[0].Style.Font = new Font(DataGridViewFarben.Font, FontStyle.Bold);
DataGridViewFarben.Rows[loopFarben].Cells[0].Style.ForeColor = Color.Red;
Falls du ihn für alle Spaltenzellen übernehmen willst, dann erzeuge eine Schleife - anstatt nur Index 0
zu verwenden.
Ich habe das mit Style ausprobiert --- funktioniert leider auch nicht.
Das Beispiel aus deinem Link habe ich auch ausprobiert: es ändert die Farbe in der gesamten Spalte. Ich dachte, es würde dann mit Rows genau so gehen - leider gibt es kei CellTemplate für Rows.
Dann scheint das DataGridView
nicht aktualisiert zu werden, evtl. noch Refresh()
o.ä. aufrufen.
Oder aber mal den gesamten Style
neu zuweisen, wie in Change dataGridView Cell Color Programmatically in C#.
Ist auch die vollkommen falsche herangehensweise.
Statt immer irgendwas herumzuprobieren, warum versuchst du nicht mal die Grundlagen zu erlernen?
In WindowsForms ist fast alles Event basiert, also wenn du auf irgendwas reagieren willst, dann such ein passendes Event.
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.datagridview?view=windowsdesktop-6.0
Für deinen Fall würde sich wahrscheinlich
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.datagridview.cellformatting?view=windowsdesktop-6.0
eignen.
Viel einfacher
Hallo,
ich habe inzwischen einiges gelesen und vielleicht auch etwas davon gelernt. Ich komme aber trotzdem nicht weiter. Mein letzter Stand ist eine Änderung im Aufruf:
DataGridViewRow row = DataGridViewFarben.Rows[loopFarben];
row.DefaultCellStyle.Font = new Font(DataGridViewFarben.Font, FontStyle.Bold);
Es funktioniert aber trotzdem nicht, und zwar (wie ich meine) aus folgendem Grund: Microsoft schreibt
Das CellFormatting Ereignis tritt jedes Mal auf, wenn jede Zelle gezeichnet wird, sodass Sie bei der Behandlung dieses Ereignisses eine lange Verarbeitung vermeiden sollten. Dieses Ereignis tritt auch auf, wenn die Zelle FormattedValue abgerufen wird oder die GetFormattedValue Methode aufgerufen wird.
Was muss ich denn jetzt tun? Die Formatierung muss ja auch ohne Eingriff des Users in diese DGV passieren, z.B. wenn in dem anderen DGV eine Änderung erfolgt.
Dann erstelle ein Datenmodell für die Farbzuordnung (per Zelle, Zeile oder Spalte) und setze dessen Werte (anstatt direkt vom anderen DataGridView
).
Und für dieses andere DataGridView
benutzt du dann dessen CellFormatting
-Ereignis, um mittels des Datenmodells die Farben zu setzen.
Hallo,
ich habe jetzt ein Datenmodell erstellt und wollte zuerst einmal wissen, ob das richtig ist und ob ich auf dem richtigen Weg bin.
Zuerst habe ich meine Klasse Farbe mit einer abgeleiteten Klasse erweitert.
public class FarbeErweitert : Farbe
{
public FarbeErweitert()
{
}
public FarbeErweitert(int red, int green, int blue, string farbname, bool markierung) : base(red, green, blue, farbname)
{
Markierung = markierung;
}
public bool Markierung { get; set; }
}
Dann habe ich eine Liste FarbeErweiterts erzeugt
List<FarbeErweitert> FarbeErweiterts = new List<FarbeErweitert>();
und dieser dann die Werte aus der Liste Farben zugewiesen und die Markierung entsprechend gesetzt.
for (loopFarben = 0; loopFarben < Farben.Count; loopFarben++)
{
FarbeErweitert xxx = new FarbeErweitert(Farben[loopFarben].Red, Farben[loopFarben].Green, Farben[loopFarben].Blue, Farben[loopFarben].Farbname, false);
FarbeErweiterts.Add(xxx);
bool used = false;
for (loopLeds = 0; loopLeds < Leds.Count; loopLeds++)
{
if (Leds[loopLeds].Ledfarbname == Farben[loopFarben].Farbname) {
used = true;
break;
}
}
if (used)
{
FarbeErweiterts[loopFarben].Markierung = true;
}
}
Ist das bis dahin richtig?