Laden...

SubItems wiederholen sich bevor es wie geplant weiter geht

Erstellt von striefchen vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.844 Views
striefchen Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren
SubItems wiederholen sich bevor es wie geplant weiter geht

Hi Leute.

Habe da ein kleines Programm zurecht gefummelt, mit dem ich Rundenzeiten für beliebig viele Teilnehmer erfasse. Mein Problem ist, das ich jedesmal wenn ich eine Gruppe starten lasse die Teilnehmernummer in der Listview eintrage. Wenn ich einem Teilnehmer dieser Gruppen die Zieldurchfahrt bestätige soll seine jeweilige Rundenzeit als nächstes eingetragen werden. Tut es, aber zuvor wird mir die Teilnehmernummer wiederholt eingetragen. Ich weiss gar nicht wieso?


  public void InitListViewStart(int neueAnzahl, int GruppenNummer)
        {
            CHIndex = 1;
            ColumnHeader columnheader = null;
            columnheader = new ColumnHeader();
            columnheader.Text = "Teilnehmer";
            columnheader.DisplayIndex = 0;
            columnheader.Name = "Teilnehmer";
            this.listView1.Columns.Add(columnheader);
            this.listView1.Columns[0].Width = 100;
        }

        private void FuelleListView(DateTime MomentanZeit)
        {
                // Füllt Items in die ListView in der Anzahl der Teilnehmer pro Gruppe
                for(int j=1; j<=AnzahlTpGruppe; j++)
                {
                    // Index des Items ist fortlaufend, während Index der teilnehmer der 
                    // entsprechenden Gruppe wieder bei 0 anfängt
                    int n = (Gruppenindex - 1) * AnzahlTpGruppe + j;
                    string ItemName = Convert.ToString(n);
                    listviewitem = new ListViewItem(ItemName);
                    listviewitem.Name = ItemName;
                    listviewitem.SubItems.Add(ItemName);
                    this.listView1.Items.Add(listviewitem); 
                }

                for (int i = 1; i <= AnzahlTpGruppe; i++)
                {
                    // Index des Items ist fortlaufend, während Index der teilnehmer der 
                    // entsprechenden Gruppe wieder bei 0 anfängt
                    int n = (Gruppenindex - 1) * AnzahlTpGruppe + i;
                    string ColumnText = Convert.ToString(n);
                    comboBox3.Items.Add(ColumnText);
                }
            iGruppen[Gruppenindex-1].StartGruppe(MomentanZeit);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                int TeilnNummer = Convert.ToInt32(comboBox3.SelectedItem);
                iGruppen[ermittleGruppenNr(TeilnNummer)].iTeilnehmer [ermittleTeilnNrZurGruppe(TeilnNummer)].AddRundenZeit(DateTime.Now);
                CHIndex++;
                ColumnHeader columnheader = null;
                // fügt neuen ColumnHeader hinzu
                columnheader = new ColumnHeader();
                columnheader.Text = "Rundenzeit";
                columnheader.Name = "Rundenzeit"+CHIndex;
                this.listView1.Columns.Add(columnheader);

                // fügt Rundenzeiten in SubItems dem jeweiligen Teilnehmer hinzu
                this.listView1.Items[TeilnNummer - 1].SubItems.Add(iGruppen[ermittleGruppenNr(TeilnNummer)].iTeilnehmer [ermittleTeilnNrZurGruppe(TeilnNummer)].RundenZeit());
            }
            catch
            {
                MessageBox.Show("Bitte eine gültige Teilnehmernummer angeben");
            }
        }

Meine Vermutung ist, dass da was bei den ColumnHeader nicht stimmt - also mit dem Namen der einzelnen.

Im Anhang steht das bisherige Programm als zip-Archiv

Kann mir da jemand helfen, ich bin ein absoluter Anfänger.

Striefchen

Wissen ist das einzige Gut welches sich vermehrt wenn man es teilt.

E
395 Beiträge seit 2007
vor 16 Jahren

this.listView1.Items[TeilnNummer - 1].SubItems.Add(iGruppen[ermittleGruppenNr(TeilnNummer)].iTeilnehmer [ermittleTeilnNrZurGruppe(TeilnNummer)].RundenZeit());

haut mich ruig bin krank aber für mich siht das stark nach einem ADD (wie hinzufügen) aus 😉

MfG Paul

striefchen Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Hi el_panter,

das soll ja auch die Rundenzeit nach dem Betätigen des Buttons2 hinzugefügt werden. Das Problem ist bloß das, dass beim Hinzufügen der ersten Rundenzeit die Teilnehmernummer erneut hinzugefügt wird. Das hatte ich aber mit einem anderen Button schon getan. Jetzt steht diese zweimal in der Listview.

Striefchen

Wissen ist das einzige Gut welches sich vermehrt wenn man es teilt.

915 Beiträge seit 2006
vor 16 Jahren

Das erste was mir auffiel "ermittleGruppenNr":
Wenn du da nach der Gruppe suchst zu der der Teilnehmer gehört, machst du folgendes:

Wenn die Teilnnehmernummer kleiner oder gleich die der der Teilnehmer einer Gruppestärke ist, so gibst du den Index Wert zurück - so weit so gut. Bei einer Teilnehmernummer die größer als die Gruppenstärke ist nimmst du den Wert und Teilst diesen durch die Gruppengröße. Klingt eigentlich logisch verursacht aber folgenden Fehler.

5 Teilnehmer 3 Gruppen 15 Leute

Soo Gruppe 1 BSP

5 Teilnehmer ≤ 5 = true daher greift deine temp =1 da 1-1 = Index 0
9 Teilnehmer ≤ 5 = false daher 9 / 5 =2 = 2 -1 = Index 1
10 Teilnehmer ≤ 5 = false daher 10 / 5 =2 = 2 -1 = Index 2 <-- FEHLER
11 Teilnehmer ≤ 5 = false daher 11 / 5 =2 = 2 -1 = Index 2
15 Teilnehmer ≤ 5 = false daher 15 / 5 = 3 = 3-1 = Index 2

Warum Fehler?
1 -5 = Gruppe 1 == Index 0
6-10 = Gruppe 2 == Index 1 <-- Man sieht nummer 10 gehört zu Gruppe 2 (Index1)
10 - 15 Gruppe 3 == Index 2

Soo nun der nächste Fehler in der Methode "ermittleTeilnNrZurGruppe" 🙂
Da rechnest Teilnehmernummer Modulo-Operator (%) Anzahl Teilnehmender zur Gruppenstärke.

5 Teilnehmer 1 Gruppen 5 Leute

Gruppe 1
1 % 5 = 1 -> 1 Index = Teilnehmer 2 -> Fehler?
2 % 5 = 2 -> 2 Index= Teilnehmer 3-> Fehler?
3 % 5= 3 -> 3 Index= Teilnehmer 4-> Fehler?
4 % 5 = 4 -> 4 Index= Teilnehmer 5-> Fehler?
5 % 5 = 5 -> 0 Index= Teilnehmer 1 -> Fehler?
Usw.. bei mehreren Gruppen wiederholt sich das dann alles.

Und das nächste, du füllst jedesmal this.listView1.Items.Add so dass evtl. Wenn Teilnehmer 1 zuerst in Runde 1 ist und kurz dannach Teilnehmer 2 in Runde 1 einläuft eine weitere Runde hinzu. So das x Runden Pro Teilnehmer entstehen. Für mich ist die Rundenanzahl etwas fixes also ein Wert den ich eingeben muss. 1 Läufergruppe a 5 Läufer die 2 Runden a 200 m laufen sollen.

Aber ehrlich, finde das zu komplex aufgebaut, schreib dir einfach mehr Hilfsklassen und leite in deinen Hilfsklassen von die List<> ab um dort die Sortierungs und Suchfunktionen nutzen zu können. Hatte wirklich Probleme zu verstehen was wie funktionieren soll, kann daher sein das ich dass ein oder andere falsch interpretiere habe 🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

striefchen Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

...gut mag sein, dass ich da auch nen Fehler gemacht habe mit der Teilnehmernummer. Aber das eigentliche Problem mit der ListView besteht dennoch.

Ich weiss einfach nicht was ich da machen soll - ich sehe den Fehler nicht.

Wissen ist das einzige Gut welches sich vermehrt wenn man es teilt.

915 Beiträge seit 2006
vor 16 Jahren

Ups, vergessen reinzuschreiben, der ist nicht einfach zu finden 🙂

Der Fehler entsteht bei der FuelleListView Methode:

Wenn nen Breakpoint mal vor der zweiten Schleife reinmachst und dir mal folgendes ansiehst : "this.listView1.Items[0].SubItems.Count". Fällt dir auf das der Count = 2 statt wie erwartet = 1 ist. Somit exestiert schon 1 Subitem mehr mit den Inhalt von Subitem 0 als erwartet. Somit wird beim hinzufügen einer neuen Column die dann den Index 1 bei 2 Columns der Wert von Subitem 1 von 2 Subitems angezeigt.

Fehler wird wie folgt behoben :

listviewitem.SubItems[0]


  // Füllt Items in die ListView in der Anzahl der Teilnehmer pro Gruppe
                for(int j=1; j<=AnzahlTpGruppe; j++)
                {
                    // Index des Items ist fortlaufend, während Index der teilnehmer der 
                    // entsprechenden Gruppe wieder bei 0 anfängt
                    int n = (Gruppenindex - 1) * AnzahlTpGruppe + j;
                    string ItemName = Convert.ToString(n);
                    ListViewItem listviewitem = new ListViewItem(ItemName);
                    listviewitem.Name = ItemName;
                    listviewitem.SubItems[0].Text = ItemName;
                    this.listView1.Items.Add(listviewitem); 
                }

Warum ist das so ? - Verdammt gute Frage:
Wenn einfach mal nur:


                ListViewItem bla = new ListViewItem("Hätte auch gerne das Zeug was man bei MS morgens in den Kaffee bekommt..");

Instanzierst wirst du merken das in "Bla" immer ein Subitem.Count = 1 vorhanden ist. Also ich erkläre mir das mal so, es wird immer davon ausgegangen das bei new ListViewItem ein Subitem vorhanden sein muss um etwas darzustellen. Zumindest fällt mir sonst keine andere Erklärung dazu ein. Würde mich nur interessieren was in der MSDN dazu steht.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

E
395 Beiträge seit 2007
vor 16 Jahren
  
  // Füllt Items in die ListView in der Anzahl der Teilnehmer pro Gruppe  
                for(int j=1; j<=AnzahlTpGruppe; j++)  
                {  
                    // Index des Items ist fortlaufend, während Index der teilnehmer der   
                    // entsprechenden Gruppe wieder bei 0 anfängt  
                    int n = (Gruppenindex - 1) * AnzahlTpGruppe + j;  
                    string ItemName = Convert.ToString(n);  
                    ListViewItem listviewitem = new ListViewItem(ItemName);  
                    listviewitem.Name = ItemName;  
                    listviewitem.SubItems[0].Text = ItemName;  
                    this.listView1.Items.Add(listviewitem);  
                    //Edit hier die änderung sichtbarer markiert   
                    comboBox3.Items.Add(ItemName);  
                    //Edit ende  
                }  
  

und wenn du es so machst kannste dir


                for (int i = 1; i <= AnzahlTpGruppe; i++)
                {
                    // Index des Items ist fortlaufend, während Index der teilnehmer der 
                    // entsprechenden Gruppe wieder bei 0 anfängt
                    int n = (Gruppenindex - 1) * AnzahlTpGruppe + i;
                    string ColumnText = Convert.ToString(n);
                    comboBox3.Items.Add(ColumnText);
                }

eigentlich auch sparen

MfG Paul

striefchen Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Einwandfrei! Das war wirklich die Lösung. Danke!

Wissen ist das einzige Gut welches sich vermehrt wenn man es teilt.