[C#] TableLayoutView

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ThaAresX
  • Registratie: September 2010
  • Laatst online: 09-10 08:52
Ik heb onderstaande eventhandler aan een button hangen. Deze moet de data van table 1 overschrijven naar table 2 en wanneer het om hetzelfde object gaat de hoeveelheid optellen.

Echter nu werkt de tablelayout niet goed. Hij telt wel alles op, alleen de table blijft nieuwe rijen tekenen waardoor er dubbele data in staat. Heb al geprobeerd te spelen met de tweede for-loop waarin ik op de rijen kijk, echter zonder positief effect. De tablelayout heeft bij init één rij die als header gebruikt wordt.

Weet iemand welke code ik moet toevoegen/wijzigen/verwijderen om alleen de optelfunctie uit te laten voeren wanneer het label al voorkomt in de tweede table?

C#:
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
private void test(object sender, EventArgs e) {
            for (int i = 1; i < FooTable1.ColumnCount - 1; i++) {
                Label lbl_foo = (Label)FooTable1.GetControlFromPosition(i, 0);
                TextBox txt_foo = (TextBox)FooTable1.GetControlFromPosition(i, 1);
                ComboBox cb_foo = (ComboBox)FooTable1.GetControlFromPosition(i, 2);

                if (!string.IsNullOrWhiteSpace(txt_foo.Text)) {
                    for (int x = 1; x <= FooTable2.RowCount - 1; x++) {
                        Label FooTable2_foo = (Label)FooTable2.GetControlFromPosition(0, x);
                        Label FooTable2.foo2 = (Label)FooTable2.GetControlFromPosition(2, x);
                        Label foo = new Label() { Text = txt_foo.Text }; 
                        Label Level = new Label() { Text = cb_foo.SelectedItem.ToString() };
                        if (FooTable2_foo == null || FooTable2.foo2 == null) {
                            // Adding to secondary table
                            FooTable2.RowCount = FooTable2.RowCount + 1;
                            FooTable2.RowStyles.Add(new RowStyle(SizeType.Absolute, 40F));
                            FooTable2.Height = FooTable2.Height + 50;
                            Label dfc = new Label() { Text = lbl_foo.Text };

                            FooTable2.Controls.Add(dfc, 0, FooTable2.RowCount - 1);
                            FooTable2.Controls.Add(foo, 1, FooTable2.RowCount - 1);
                            FooTable2.Controls.Add(Level, 2, FooTable2.RowCount - 1);
                        } else {
                            if (FooTable2_foo .Text.Equals(lbl_foo.Text) && FooTable2.foo2.Text.Equals(cb_foo .SelectedItem.ToString())) {
                                Label foo3 = (Label)FooTable2.GetControlFromPosition(1, x);
                                int total = int.Parse(foo .Text) + int.Parse(txt_foo .Text);
                                foo3.Text = total.ToString();
                            }
                        }
                    }
                }
            }
        }

Verwijderd

Stel, je loopt door een list heen, en ondertussen voeg je items toe aan dezelfde list, wat zou er dan gebeuren ?

Acties:
  • 0 Henk 'm!

  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 00:14

Tribits

Onkruid vergaat niet

Het klinkt alsof het de bedoeling is dat je een rij uit tabel1 ophaalt, probeert een rij in kolom twee te vinden met dezelfde sleutel, de waarde uit tabel1 optelt bij het totaal uit rij2 als dat is gelukt, en als de sleutel niet wordt gevonden een rij toevoegt aan tabel2. Dat is tenminste wat ik opmaak uit je omschrijving, en dat kan op zich ook wel, hoewel het de vraag is of dit de beste oplossing daarvoor is. Als ik echter naar je code kijk zie ik iets heel anders, en dat begint al met de iteratie door de kolommen die in voorgaande omschrijving niet voorkomt. Probeer het geheel eens als algoritme uit te schrijven en dan om te zetten in code.

[ Voor 7% gewijzigd door Tribits op 27-11-2015 17:14 ]

Master of questionable victories and sheer glorious defeats


Acties:
  • 0 Henk 'm!

Verwijderd

Mijn vorige antwoord was een hint.

Maar goed, in de tweede for loop gebruik je FooTable2.RowCount, welke oploopt als je rijen toevoegt aan tabel FooTable2. Hierdoor ontstaan er meerdere rijen.

Verder zou ik je eerste for loop even onder de loep nemen, deze skipt de eerste en laatste kolommen van elke rij. Wellicht gewenst, of juist niet :)

Acties:
  • 0 Henk 'm!

  • ThaAresX
  • Registratie: September 2010
  • Laatst online: 09-10 08:52
Verwijderd schreef op vrijdag 27 november 2015 @ 21:00:
Mijn vorige antwoord was een hint.

Maar goed, in de tweede for loop gebruik je FooTable2.RowCount, welke oploopt als je rijen toevoegt aan tabel FooTable2. Hierdoor ontstaan er meerdere rijen.

Verder zou ik je eerste for loop even onder de loep nemen, deze skipt de eerste en laatste kolommen van elke rij. Wellicht gewenst, of juist niet :)
Dank voor de reacties. Ik heb het uiteindelijk voor elkaar gekregen door eerst pseudo code op papier te schrijven en die om te bouwen naar werkende code.

C#:
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
private void add(object sender, EventArgs e) {
            //Initiate lists for storage of the objects
            List<Row> InputList = new List<Row>();
            List<Row> OutputList = new List<Row>();

            //Loop through the input table and store in new objects and add to the defined list
            for (int i = 1; i < Table.ColumnCount - 1; i++) {
                string name = Table.GetControlFromPosition(i, 0).Text;
                string level = Table.GetControlFromPosition(i, 2).Text;
                string quantity = .GetControlFromPosition(i, 1).Text;
                int position = i;

                //Check if the textboxes are empty or null
                if (!string.IsNullOrWhiteSpace(quantity) && !string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(level)) {
                    Row def = new Row(name, int.Parse(quantity), level, position);
                    InputList.Add(def);
                }
            }

            //Loop through output table and add to defined list
            //Edge of index must be high enough so every variaton of defect could be already stored in table
            for (int x = 1; x < 100; x++) {
                Label dName = (Label)Overview.GetControlFromPosition(0, x);
                Label dQuantity = (Label)Overview.GetControlFromPosition(1, x);
                Label dLevel = (Label)Overview.GetControlFromPosition(2, x);

                if (dName != null && dQuantity != null && dLevel != null) {
                    string defect = Overview.GetControlFromPosition(0, x).Text;
                    string quantity = Overview.GetControlFromPosition(1, x).Text;
                    string level = Overview.GetControlFromPosition(2, x).Text;
                    int position = x;

                    //Store every line in the output table in objects
                    if (!string.IsNullOrWhiteSpace(quantity) && !string.IsNullOrWhiteSpace(defect) && !string.IsNullOrWhiteSpace(level)) {
                       Row def = new Row(defect, int.Parse(quantity), level, position);
                        OutputList.Add(def);
                    }
                } else {
                    x++;
                }


            }

            //Loop through the inputList. If there are any matches, remove those objects from the inputList and sum the quanitity.
            for (int index = 0; index < InputList.Count; index++) {
                //If output table isn't empty sum the quantity
                if (OutputList.Count > 0) {
                    foreach (Row row in OutputList) {
                        if (InputList[index].Name == row.Name && InputList[index].Level == row.Level) {
                            row.Quantity += InputList[index].Quantity;
                            DefectOverview.GetControlFromPosition(1, row.Position).Text = row.Quantity.ToString();
                            InputList.RemoveAt(index);
                        }
                    }
                }
            }

            //Loop through the inputList after matched objects are removed to add new lines to the table.
            for(int a = 0; a < InputList.Count; a++) {
                Overview.RowCount += 1;
                Overview.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
                Overview.Height += 50;

                Label nDefect = new Label() { Text = InputList[a].Name };
                Label nQuantity = new Label() { Text = InputList[a].Quantity.ToString() };
                Label nLevel = new Label() { Text = InputList[a].Level };

                Overview.Controls.Add(nDefect, 0, DefectOverview.RowCount - 1);
                Overview.Controls.Add(nQuantity, 1, DefectOverview.RowCount - 1);
                Overview.Controls.Add(nLevel, 2, DefectOverview.RowCount - 1);
            }

            //Clear the lists
            InputList.Clear();
            OutputList.Clear();


            //Clear the textboxes in the input table so new defects can be added
            for (int i = 1; i < AddDefectTable.ColumnCount - 1; i++) {
                TextBox tx = (TextBox)AddDefectTable.GetControlFromPosition(i, 1);
                ComboBox cb = (ComboBox)AddDefectTable.GetControlFromPosition(i, 2);
                tx.Clear();
                cb.SelectedIndex = -1;
            }
        }