Laden...

Formatierung wird nicht in DataGridView übernommen

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 351 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Formatierung wird nicht in DataGridView übernommen

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?

Karl Stanger
4.942 Beiträge seit 2008
vor einem Jahr

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.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

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.

Karl Stanger
4.942 Beiträge seit 2008
vor einem Jahr

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#.

F
10.010 Beiträge seit 2004
vor einem Jahr

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

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

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.

Karl Stanger
4.942 Beiträge seit 2008
vor einem Jahr

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.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

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?

Karl Stanger