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.
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
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.
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(
...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.
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(
// 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
Einwandfrei! Das war wirklich die Lösung. Danke!
Wissen ist das einzige Gut welches sich vermehrt wenn man es teilt.