Entwickler-Ecke

WinForms - Datagridview CellStyle ändern


Koto - Di 31.01.17 09:55
Titel: Datagridview CellStyle ändern
Hallo zusammen,
ich habe folgendes Problem:
Mit Hilfe der untenstehenden foreach durchlaufe ich jede Zeile eines DGV, um nach bestimmten Werten zu suchen und diese in Variablen abzuspeichern. Dabei sollen in einem Fall (3. if) die übernommenen Zeilen markiert werden. Klappt auch alles einwandfrei (im Debugger ersichtlich, dass BackColor verändert wird). Nur die Markierung der 1. Zeile verschwindet wieder, sobald die nächste Zeile mit einer Übereinstimmung gefunden wurde. Wird eine 3. Zeile mit einer Übereinstimmung gefunden, bleibt die bisherige Markierung bestehen und zusätzlich wird die 3. Zeile markiert. Dieses Problem bezieht sich dann scheinbar nur auf die 1. Zeile.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
 
foreach (DataGridViewRow row in grdDaten.Rows)
            {
                if (cbxVerbautInAnderenProjekte.Checked == false)
                {
                    if ((row.Cells["BestelltFürProjekt"].Value.ToString() == cbxBestelltFuer.Text) && (row.Cells["WagMenge"].Value != DBNull.Value))
                    {
                        bestelltFuerSumme = bestelltFuerSumme + (Convert.ToDecimal(row.Cells["WasWarenwert"].Value) * Convert.ToDecimal(row.Cells["WagMenge"].Value));
                        
                    }

                   if ((row.Cells["BestelltFürProjekt"].Value.ToString() == cbxBestelltFuer.Text) && (row.Cells["VerbautInProjekt"].Value.ToString() == cbxVerbautIn.Text) && (row.Cells["WagMenge"].Value != DBNull.Value))
                    {
                        verbautInSumme = verbautInSumme + (Convert.ToDecimal(row.Cells["WasWarenwert"].Value) * Convert.ToDecimal(row.Cells["WagMenge"].Value));
                        row.DefaultCellStyle.BackColor = Color.LightGray;

                    }

                    
     
                }
                else if (cbxVerbautInAnderenProjekte.Checked == true)
                {
                    if ((row.Cells["BestelltFürProjekt"].Value.ToString() == cbxBestelltFuer.Text) && (row.Cells["VerbautInProjekt"].Value.ToString() != cbxBestelltFuer.Text) && (row.Cells["VerbautInProjekt"].Value != DBNull.Value) && (row.Cells["WagMenge"].Value != DBNull.Value))
                    {
                        bestelltFuerSumme = bestelltFuerSumme + (Convert.ToDecimal(row.Cells["WasWarenwert"].Value) * Convert.ToDecimal(row.Cells["WagMenge"].Value));
                        row.DefaultCellStyle.BackColor = Color.LightGray;
                    }

                  
                }


                bindingsource.Filter = String.Format("Convert(BestelltFürProjekt, System.String) LIKE '%{0}%'", cbxBestelltFuer.Text);

            }

            if (cbxVerbautInAnderenProjekte.Checked == false)
            {
                txbSummeBestelltFuer.Text = Convert.ToString(bestelltFuerSumme);
                txbSummeVerbautIn.Text = Convert.ToString(verbautInSumme);
                txbSummeGesamt.Text = Convert.ToString(bestelltFuerSumme - verbautInSumme);
            }
            else if (cbxVerbautInAnderenProjekte.Checked == true)
            {
                txbSummeGesamt.Text = Convert.ToString(bestelltFuerSumme);
            }
        }


Jemand eine Idee, wo mein Fehler liegen könnte?

Gruß
Koto


Th69 - Di 31.01.17 12:57

Hallo,

du solltest besser DataBinding verwenden (d.h. eine eigene Klasse oder aber eine DataTable), anstatt direkt über die DataGridView-Rows zu iterieren - also die Trennung von UI und (Business)Logik.

Was genau verstehst du unter Markierung? Meinst du deine Einfärbung oder aber Selection (hier wäre dann noch wichtig ob du SelectionMode auf FullRowSelect gesetzt hast)?

PS: Was soll die bindingsource.Filter-Zuweisung innerhalb der Schleife bewirken???


Koto - Mi 01.02.17 10:07

Hoi,
schon mal vielen Dank für die Antwort.
Lediglich das Einfärben der Zeile.

Oh, ja das gehört natürlich außerhalb. Besten Dank für den Hinweis.


Th69 - Mi 01.02.17 11:50

Kann es nicht trotzdem etwas mit der Selection zu tun haben, d.h. wenn du mal eine andere (als die erste) Zeile anklickst, paßt dann die Einfärbung der ersten Zeile?


Koto - Mi 01.02.17 12:02

Die Verschiebung des Bindingsource Filters hat ausgereicht. Ich habe den Filter einfach vor die foreach geschoben und das hat den Fehler beseitigt.