Autor Beitrag
Chocoemilio
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 14.03.18 18:13 
Hallo zusammen

Zur Zeit arbeite ich an ein Problem, das das Scrollen und die dazu gehörten berechnungen bein mainViewDataGridView_RowPrePaint verursachen. Beim scrollen friet halt das dataGridView immer ein durch die berechnungen. Jetzt möchte ich das umschreiben aber Windows Form Kenntnisse sammle ich jetzt gerade erst.

Das befüllen des DataGridView erfolgt über DataSet.MainViewDataTable

ausblenden C#-Quelltext
1:
this.mainViewDataTableTableAdapter1.FillByAllFba(this.azManagerDataSet2.MainViewDataTable, RegistryModule.getInstance().SellerMandant, RegistryModule.getInstance().ImporterMandant);					


Die Daten werden befüllt.
Danach habe ich bei der letzt Aktion des WindowsLoad im dataGridView2_CellFormatting eine Aufruf in eine neue Methode erstellt, wo die ganzen Berechnungen ausgewertet werden.

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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
private void dataGridView2_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            string rName = mainViewDataGridView.Columns[e.ColumnIndex].Name;
            if (rName.EndsWith("de"))
            {
                if (e.CellStyle.BackColor == Color.WhiteSmoke)
                {
                    e.CellStyle.BackColor = Color.LightGoldenrodYellow;
                }
                else
                {
                    e.CellStyle.BackColor = Color.Ivory;
                }
            }
            else if (rName.EndsWith("gb"))
            {
                if (e.CellStyle.BackColor == Color.WhiteSmoke)
                {
                    e.CellStyle.BackColor = Color.LightCyan;
                }
                else
                {
                    e.CellStyle.BackColor = Color.MintCream;
                }
            }
            else if (rName.EndsWith("fr"))
            {
                if (e.CellStyle.BackColor == Color.WhiteSmoke)
                {
                    e.CellStyle.BackColor = Color.Bisque;
                }
                else
                {
                    e.CellStyle.BackColor = Color.Linen;
                }
            }
            else if (rName.EndsWith("it"))
            {
                if (e.CellStyle.BackColor == Color.WhiteSmoke)
                {
                    e.CellStyle.BackColor = Color.Honeydew;
                }
                else
                {
                    e.CellStyle.BackColor = Color.MintCream;
                }
            }
            else if (rName.EndsWith("es"))
            {
                if (e.CellStyle.BackColor == Color.WhiteSmoke)
                {
                    e.CellStyle.BackColor = Color.Lavender;
                }
                else
                {
                    e.CellStyle.BackColor = Color.AliceBlue;
                }
            }
            if ((rName.StartsWith("distance") || rName.StartsWith("reach")) && e.Value != null)
            {
                decimal days;
                if (Decimal.TryParse(e.Value.ToString(), out days))
                {
                    if (days < 21)
                    {
                        e.CellStyle.BackColor = Color.Salmon;
                    }
                    else if (days < 28)
                    {
                        e.CellStyle.BackColor = Color.Orange;
                    }
                    else if (days < 42)
                    {
                        e.CellStyle.BackColor = Color.LightBlue;
                    }
                }
            }
            else if (rName.StartsWith("marketplace_") || rName == "available")
            {
                e.CellStyle.Font = new Font(mainViewDataGridView.Font, FontStyle.Bold);
            }
            else if (rName == "shipments")
            {
                if (e.Value != null && e.Value.ToString().Length > 0)
                {
                    e.CellStyle.BackColor = Color.PaleGreen;
                }
            }
            if (mainViewDataGridView.Rows[e.RowIndex].Cells["flag_1"].Value != null
                && mainViewDataGridView.Rows[e.RowIndex].Cells["flag_1"].Value.ToString().Equals("Y"))
            {
                if (e.CellStyle.Font.Bold)
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold | FontStyle.Italic);
                }
                else
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Italic);
                }
            }
            if (mainViewDataGridView.Rows[e.RowIndex].Cells["flag_2"].Value != null
                && mainViewDataGridView.Rows[e.RowIndex].Cells["flag_2"].Value.ToString().Equals("Y"))
            {
                e.CellStyle.ForeColor = Color.DarkGray;
                if (e.CellStyle.Font.Bold && e.CellStyle.Font.Italic)
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Italic | FontStyle.Bold | FontStyle.Strikeout);
                }
                else if (e.CellStyle.Font.Bold)
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold | FontStyle.Strikeout);
                }
                else if (e.CellStyle.Font.Italic)
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Italic | FontStyle.Strikeout);
                }
                else
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Strikeout);
                }
            }
            if (mainViewDataGridView.Rows[e.RowIndex].Cells["ActiveCount"].Value != null
                && mainViewDataGridView.Rows[e.RowIndex].Cells["ActiveCount"].Value.ToString().Equals("0"))
            {
                e.CellStyle.ForeColor = Color.Gray;
            }

            if(count == 0)
            {
                Berechnungen();
            } 
        }

        int count = 0;
        private void Berechnungen()
        {
            int marketplace_de = 0;
            int marketplace_gb = 0;
            int marketplace_fr = 0;
            int marketplace_it = 0;
            int marketplace_es = 0;

            decimal distance_de = 0;
            decimal distance_gb = 0;
            decimal distance_fr = 0;
            decimal distance_it = 0;
            decimal distance_es = 0;

            int shipments_de = 0;
            int shipments_gb = 0;
            int shipments_fr = 0;
            int shipments_it = 0;
            int shipments_es = 0;

            for (int i = 0; i < this.azManagerDataSet2.MainViewDataTable.Count; i++)
            {
                marketplace_de = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["marketplace_de"].ToString());
                marketplace_gb = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["marketplace_gb"].ToString());
                marketplace_fr = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["marketplace_fr"].ToString());
                marketplace_it = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["marketplace_it"].ToString());
                marketplace_es = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["marketplace_es"].ToString());

                distance_de = ParseDecimal(this.azManagerDataSet2.MainViewDataTable.Rows[i]["distance_de"].ToString());
                distance_gb = ParseDecimal(this.azManagerDataSet2.MainViewDataTable.Rows[i]["distance_gb"].ToString());
                distance_fr = ParseDecimal(this.azManagerDataSet2.MainViewDataTable.Rows[i]["distance_fr"].ToString());
                distance_it = ParseDecimal(this.azManagerDataSet2.MainViewDataTable.Rows[i]["distance_it"].ToString());
                distance_es = ParseDecimal(this.azManagerDataSet2.MainViewDataTable.Rows[i]["distance_es"].ToString());

                shipments_de = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["shipments_de"].ToString());
                shipments_gb = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["shipments_gb"].ToString());
                shipments_fr = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["shipments_fr"].ToString());
                shipments_it = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["shipments_it"].ToString());
                shipments_es = ParseInt(this.azManagerDataSet2.MainViewDataTable.Rows[i]["shipments_es"].ToString());

                string reach_de = string.Empty;
                string reach_gb = string.Empty;
                string reach_fr = string.Empty;
                string reach_it = string.Empty;
                string reach_es = string.Empty;

                if (marketplace_de != 0 && distance_de != 0 && shipments_de != 0)
                {
                    reach_de = (distance_de + (shipments_de / (marketplace_de / distance_de))).ToString("N1");
                }
                else
                {
                    if (shipments_de > 0)
                    {
                        reach_de = shipments_de.ToString();
                    }
                    else
                    {
                        reach_de = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_de"].Value.ToString();
                    }
                }
                if (marketplace_gb != 0 && distance_gb != 0 && shipments_gb != 0)
                {
                    reach_gb = (distance_gb + (shipments_gb / (marketplace_gb / distance_gb))).ToString("N1");
                }
                else
                {
                    if (shipments_gb > 0)
                    {
                        reach_gb = shipments_gb.ToString();
                    }
                    else
                    {
                        reach_gb = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_gb"].Value.ToString();
                    }
                }
                if (marketplace_fr != 0 && distance_fr != 0 && shipments_fr != 0)
                {
                    reach_fr = (distance_fr + (shipments_fr / (marketplace_fr / distance_fr))).ToString("N1");
                }
                else
                {
                    if (shipments_fr > 0)
                    {
                        reach_fr = shipments_fr.ToString();
                    }
                    else
                    {
                        reach_fr = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_fr"].Value.ToString();
                    }
                }
                if (marketplace_it != 0 && distance_it != 0 && shipments_it != 0)
                {
                    reach_it = (distance_it + (shipments_it / (marketplace_it / distance_it))).ToString("N1");
                }
                else
                {
                    if (shipments_it > 0)
                    {
                        reach_it = shipments_it.ToString();
                    }
                    else
                    {
                        reach_it = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_it"].Value.ToString();
                    }
                }
                if (marketplace_es != 0 && distance_es != 0 && shipments_es != 0)
                {
                    reach_es = (distance_es + (shipments_es / (marketplace_es / distance_es))).ToString("N1");
                }
                else
                {
                    if (shipments_es > 0)
                    {
                        reach_es = shipments_es.ToString();
                    }
                    else
                    {
                        reach_es = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_es"].Value.ToString();
                    }
                }

                this.azManagerDataSet2.MainViewDataTable[i].reach_de = reach_de;
                this.azManagerDataSet2.MainViewDataTable[i].reach_gb = reach_gb;
                this.azManagerDataSet2.MainViewDataTable[i].reach_fr = reach_fr;
                this.azManagerDataSet2.MainViewDataTable[i].reach_it = reach_it;
                this.azManagerDataSet2.MainViewDataTable[i].reach_es = reach_es;
            }
            count++;
        }


Vor dem öffnen des DataGridView werden die gemachten Änderungen angezeigt im Debug: this.azManagerDataSet2.MainViewDataTable.Rows


Wenn das DataGridView aufgebaut ist, ist die gemachte Berechnung nicht mehr da ???????


Wäre super wenn mir jemand da ein Tip geben würde.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 14.03.18 20:58 
Zuviel, wahrscheinlich nicht relevanter, Code.

Die gebundene DataTable aus dem CellFormatting Event zu ändern ist aber definitiv keine gute Idee. Ändern der DataTable triggert den Aufruf des Events um die Änderung auch passend zu visualisieren. Die wiederum die Änderung ausführt um wieder den Event zu triggern. Du hast dir da eine potentielle Endlosschleife gebastelt. Berechnungen() solltest du auf keinem Fall aus diesem Event aufrufen.

Nebenbei Berechnung() sieht nach sehr viel unnötiger Codeduplizierung aus der sich sehr leicht in was lesbares Refaktoren lassen sollte.
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 16.03.18 09:19 
Hi

Danke für die Antwort, Ich werde das Projekt bald in WPF umschreiben, vorher wollte ich nur dieses lästige einfrieren ändern. Ich habe das Projekt auch nicht erstellt.

Die CellFormatting soll so bleiben. Im momment sollen wirklich nur die Berechnungen die gemacht wurden auch im DataGridView angezeigt werden bis sind die Felder Leer ???

Ich weiß einfach nicht warum ???
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: Fr 16.03.18 10:18 
Wir Ralf schon geschrieben hat, darf man im CellFormatting (sowie in jedem anderen Cell-) Ereignis nur die Daten des aktuellen Feldes (mittels des übergebenen Parameters DataGridViewCellFormattingEventArgs) ändern, auf keinen Fall andere Felder des DGVs!

Du mußt die Logik des Programms ändern, ansonsten wirst du es nicht lösen!

Und in WPF wirst du noch viel strikter zwischen UI, ViewModel und Logik unterscheiden müssen (MVVM)...
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 16.03.18 12:36 
Hi

Sorry habe noch nie mit Win Forms gearbeitet deswegen verstehe ich nicht was Ihr leider schreibt.

Die CellFormatting, da wird doch nur die Methode aufgerufen das hätte ich auch woanders machen können, bloß das war der letzte aufruf.

In WPF hätte ich das alles ganz anders geschrieben. Danke für die Hilfe aber wie kann ich das jetzt aufrufen das es angezeigt wird ????

Ich versteh die vorgehensweise in Win Forms nicht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 16.03.18 12:43 
Und das Aufrufen der Methode ändert den Inhalt der DataTable. Und andere Daten müßen eventuell im Grid anders dargestellt werden also wird wieder CellFormatting aufgerufen um potentiell geänderte Formattierung anzuwenden. Berechnung() wird also CellFormatting Events auslösen und CellFormatting wird wieder Berechnung() aufrufen. So zumindest müßen wir das annehmen aus den Codeteilen die du zeigst.
Rufe Berechnung direkt nach dem befüllen mit dem TableAdapter auf und niem es aus dem Event raus.

Falls man deine DataTable danach noch bearbeiten kann (z.b. in genau diesem DataGridView) und das Auswirkung auf die berechneten Felder hat müßten wir uns was anderes überlegen. Dafür fehlen uns dann aber die Details zu deiner Anwendung um da wirklich zu helfen.
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 16.03.18 17:09 
Ok ich habe jetzt die Methode aus der Event entfernt und Sie gleich nach dem befüllen des TableAdapters aufrufen lassen.

Und es funktioniert aber es gibt ein großes Problem und zwar sind das 2500 rows die der durchgeht und das dauert einfach viel zu lange.

Also ist das keine Lösung:

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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
        private void Berechnungen()
        {
            
            for(int i = 0; i < mainViewDataGridView.RowCount; i++)
            {
                int marketplace_de = Convert.ToInt32(mainViewDataGridView.Rows[i].Cells["marketplace_de"].Value.ToString());
                int marketplace_gb = Convert.ToInt32(mainViewDataGridView.Rows[i].Cells["marketplace_gb"].Value.ToString());
                int marketplace_fr = ParseInt(mainViewDataGridView.Rows[i].Cells["marketplace_fr"].Value.ToString());
                int marketplace_it = ParseInt(mainViewDataGridView.Rows[i].Cells["marketplace_it"].Value.ToString());
                int marketplace_es = ParseInt(mainViewDataGridView.Rows[i].Cells["marketplace_es"].Value.ToString());

                decimal distance_de = ParseDecimal(mainViewDataGridView.Rows[i].Cells["distance_de"].Value.ToString());
                decimal distance_gb = ParseDecimal(mainViewDataGridView.Rows[i].Cells["distance_gb"].Value.ToString());
                decimal distance_fr = ParseDecimal(mainViewDataGridView.Rows[i].Cells["distance_fr"].Value.ToString());
                decimal distance_it = ParseDecimal(mainViewDataGridView.Rows[i].Cells["distance_it"].Value.ToString());
                decimal distance_es = ParseDecimal(mainViewDataGridView.Rows[i].Cells["distance_es"].Value.ToString());

                int shipments_de = ParseInt(mainViewDataGridView.Rows[i].Cells["shipments_de"].Value.ToString());
                int shipments_gb = ParseInt(mainViewDataGridView.Rows[i].Cells["shipments_gb"].Value.ToString());
                int shipments_fr = ParseInt(mainViewDataGridView.Rows[i].Cells["shipments_fr"].Value.ToString());
                int shipments_it = ParseInt(mainViewDataGridView.Rows[i].Cells["shipments_it"].Value.ToString());
                int shipments_es = ParseInt(mainViewDataGridView.Rows[i].Cells["shipments_es"].Value.ToString());

                string reach_de = string.Empty;
                string reach_gb = string.Empty;
                string reach_fr = string.Empty;
                string reach_it = string.Empty;
                string reach_es = string.Empty;

                if (marketplace_de != 0 && distance_de != 0 && shipments_de != 0)
                {
                    reach_de = (distance_de + (shipments_de / (marketplace_de / distance_de))).ToString("N1");
                }
                else
                {
                    if (shipments_de > 0)
                    {
                        reach_de = shipments_de.ToString();
                    }
                    else
                    {
                        reach_de = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_de"].Value.ToString();
                    }
                }
                if (marketplace_gb != 0 && distance_gb != 0 && shipments_gb != 0)
                {
                    reach_gb = (distance_gb + (shipments_gb / (marketplace_gb / distance_gb))).ToString("N1");
                }
                else
                {
                    if (shipments_gb > 0)
                    {
                        reach_gb = shipments_gb.ToString();
                    }
                    else
                    {
                        reach_gb = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_gb"].Value.ToString();
                    }
                }
                if (marketplace_fr != 0 && distance_fr != 0 && shipments_fr != 0)
                {
                    reach_fr = (distance_fr + (shipments_fr / (marketplace_fr / distance_fr))).ToString("N1");
                }
                else
                {
                    if (shipments_fr > 0)
                    {
                        reach_fr = shipments_fr.ToString();
                    }
                    else
                    {
                        reach_fr = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_fr"].Value.ToString();
                    }
                }
                if (marketplace_it != 0 && distance_it != 0 && shipments_it != 0)
                {
                    reach_it = (distance_it + (shipments_it / (marketplace_it / distance_it))).ToString("N1");
                }
                else
                {
                    if (shipments_it > 0)
                    {
                        reach_it = shipments_it.ToString();
                    }
                    else
                    {
                        reach_it = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_it"].Value.ToString();
                    }
                }
                if (marketplace_es != 0 && distance_es != 0 && shipments_es != 0)
                {
                    reach_es = (distance_es + (shipments_es / (marketplace_es / distance_es))).ToString("N1");
                }
                else
                {
                    if (shipments_es > 0)
                    {
                        reach_es = shipments_es.ToString();
                    }
                    else
                    {
                        reach_es = string.Empty; // mainViewDataGridView.Rows[e.RowIndex].Cells["distance_es"].Value.ToString();
                    }
                }

                mainViewDataGridView.Rows[i].Cells["reach_de"].Value = reach_de;
                mainViewDataGridView.Rows[i].Cells["reach_gb"].Value = reach_gb;
                mainViewDataGridView.Rows[i].Cells["reach_fr"].Value = reach_fr;
                mainViewDataGridView.Rows[i].Cells["reach_it"].Value = reach_it;
                mainViewDataGridView.Rows[i].Cells["reach_es"].Value = reach_es;
            }
            count++;
        }


In diesen Quelltext berechne ich das in der MainViewDataGridView, ich habe 30 min gewartet.

Wenn ich das aber über die this.azManagerDataSet2.MainViewDataTable.Rows ändere braucht er nur sekunden.
Wie kann ich die Daten im nachhinein an das mainViewDataGridView übergeben ????

Als letztees würde ich das im DB aufruf machen aber ich möchte das gere so wissen. Weil ich in der Richtung nooch einiges zu tun habe.

Help
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 16.03.18 21:43 
Ich kann da nur Vermutungen anstellen. Von dem was da in der Methode passiert dürfte das nicht lange dauern. Nichtmal Sekunden.
Ein Problem könnte sein das bereits Events verdrahtet sind die jetzt beim ändern der Daten aufgerufen werden und irgendwas wildes anstellen und hier unnötigerweise Zeit kosten.
Wie kommen den jetzt die Daten in das DataGridView? Hast du die DataTable einfach direkt gebunden? Oder kopierst du Daten aus der DataTable explizit ins DataGridView? Oder noch irgendwas anderes.

Wenn möglich würde ich die Daten direkt in der DataTable ändern bzw. der DataTable hinzufügen und erst dann die DataTable an das DataGridView binden und auch erst dann irgendwelche Event an der DataTable verdrahten falls du da irgendwelche hast.
Dann hast du ausgeschlossen das irgendwelche Events viel zu früh viel zu oft unnötig gefeuert werden (wie z.B. CellFormatting das du eigentlich erst brauchst wenn alle Daten berechnet sind).
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 20.03.18 09:31 
Hi

Ja das macht er wohl.

Zur Zeit werden die Daten so an von der DataTable an das DataGridView übergeben.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// mainViewDataTableBindingSource
            // 
            this.mainViewDataTableBindingSource.DataMember = "MainViewDataTable";
            this.mainViewDataTableBindingSource.DataSource = this.azManagerDataSet2;

this.mainViewDataGridView.DataSource = this.mainViewDataTableBindingSource;

 this.mainViewDataTableTableAdapter1.FillByAllFba(this.azManagerDataSet2.MainViewDataTable, RegistryModule.getInstance().SellerMandant, RegistryModule.getInstance().ImporterMandant);


Warum Funktioniert nicht einfach eine übergabe so z.B

ausblenden C#-Quelltext
1:
mainViewDataGridView.DataSource = this.azManagerDataSet2.MainViewDataTable.Rows;					


???????????????
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 20.03.18 12:05 
Zwei Dinge

a.) Damit alle Features von DataBinding genutzt werden können müßen die gebundenen Daten bestimmte Interfaces implementieren um diese Features zu bekommen. Z.B. Damit das Grid Änderungen an der gebunden Liste mitbekommt müßte IBIndingList implementiert sein. Die Rows Collection hätte das nicht und eine BindingSource rüstet das quasi nach.
b.) Oft hat man eine Datenquelle nicht nur an ein Control gebunden sondern an viele. Wenn man nun die Quelle zur Laufzeit wechseln möchte kann mann das nun genau an einer Stelle die BindingSource und muß nicht alle Controls nachziehen. Die BindingSource läßt sich auch viel einfacher schon in graphischen Designer verwenden um die ganzen Beziehungen aufzubauen. Die eigentliche Datenquelle hast du ja erst zur Laufzeit.


Da du eine gebundene (sogar typisierte) DataTable hast frage ich mich jetzt warum du die Daten direkt im Grid änderst und nicht an der DataTable? Das wiederspricht dem ganzen Bindingkonzept und führt möglicherweise zu diversen Problemen.
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 20.03.18 12:51 
Nee ich habe die Daten jetzt wieder in der DataTable geändert.

Und nach deiner Ausführung muss ich das jetzt an die BindingSource übergeben.

Versuche das mal nachzuvollziehen was du geschrieben hast und es umzusetzen.

So was in der Art:
ausblenden C#-Quelltext
1:
2:
this.mainViewDataTableBindingSource.DataMember = "MainViewDataTable";
this.mainViewDataTableBindingSource.DataSource = this.azManagerDataSet2.MainViewDataTable;


Hatte ich schon mal probiert aber nichts, ich suche weiter.

P.s Ihr müsst davon ausgehen das die Daten schon korrek geändert wurden im: this.azManagerDataSet2.MainViewDataTable.