Autor Beitrag
Koto
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 31.01.17 09:55 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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???

Für diesen Beitrag haben gedankt: Koto
Koto Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.