Entwickler-Ecke
WinForms - Array - Index wird im 2. Schleifendurchlauf mit -1 unvalide
AlexMack - Fr 07.01.11 09:03
Titel: Array - Index wird im 2. Schleifendurchlauf mit -1 unvalide
Hallo gemeinsam!
Ich habe ein Problem mit einem Gridview - element. Es ist so, dass meine Gridview nicht aus einer Datasource versorgt wird (weil sonst andere Funktionen , die ich bereits implementiert habe, nicht mehr funktionieren würden), sondern aus mehreren Arrays und die Daten aus dem Array ständig mit den Daten aus dem DataGridview - element synchronisiert werden müssen. Jetzt möchte ich, dass der Benutzer mehrere Zeilen (z.B. 2,4,7) markieren und löschen kann.
Hier ist nun das Problem: ich kopiere die vom benutzer markierten zeilen in eine Variable und möchte diese mit einer SChleife löschen. Das funktioniert für die 1. zeile des Arrays tadelos, im 2. und 3. Durchlauf der Schleife wird er Arrayindex auf -1 gesetzt und die schleife wird nicht durchlaufen. Was mache ich falsch?
Hier ist meine Funktion:
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:
| private void deleteRowToolStripMenuItem_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count > 0) { int anzahl = dataGridView1.SelectedRows.Count; var myRows = dataGridView1.SelectedRows;
for (int k = anzahl - 1; k >= 0; k--) { DataGridViewRow row = myRows[k]; if (row.Index >= 0 && row.Index < dataGridView1.Rows.Count) {
int realRunIndex = 0; int runIndex = (row.Index - 2) / 4; int[][][] originData = dataGridView1.Rows[row.Index].Tag as int[][][]; if (m_StepIndex < 3) { runIndex = runIndex + ((m_StepIndex) * 4); } else { switch (runIndex) { case 0: runIndex = 1; break; case 1: runIndex = 5; break;
case 2: runIndex = 9; break;
} }
if (originData.Length > runIndex && originData[runIndex] != null) realRunIndex = originData[runIndex][row.Index][1];
int peakIndex = 0; int changedPeakIndex = 0; if (originData.Length == 1) { peakIndex = ((int[])originData[0][row.Index])[0]; changedPeakIndex = ((int[])originData[0][row.Index])[2]; } else { peakIndex = ((int[])originData[runIndex][row.Index])[0]; changedPeakIndex = ((int[])originData[runIndex][row.Index])[2]; }
int[] indexArray = new int[Runs.Length]; for (int i = 0; i < Runs.Length; i++) { indexArray[i] = i; }
CommandManager.Execute(new ChangeDataEntryGridCommand(ChangedRuns, new ChangeDataEntryGridCommand.DoSomething(RemoveAllPeaks), new object[] { indexArray, changedPeakIndex })); } } } buildTable(); } |
ich hoffe, jemand von Euch kann mir helfen... danke bereits im voraus
Moderiert von
Christian S.: C#-Tags hinzugefügt
Trashkid2000 - Fr 07.01.11 19:53
Hallo und :welcome:
Also, ich muss gestehen, dass ich nicht wirklich verstanden habe, was Du in der Prozedur machst.
Kann aber gut sein, dass ich heute nicht mehr wirklich aufnahmefähig bin oder der Code einfach viel zu Overhead ist, um ein paar Zeilen aus der Grid zu löschen.
Du brauchst Dir doch gar nicht solche Sachen wie realIndex, peakIndex und was noch so alles angewendet wird, zu merken.
Die Lösung könnte so einfach aussehen:
C#-Quelltext
1: 2: 3: 4:
| foreach (DataGridViewRow row in dataGridView1.SelectedRows.OfType<DataGridViewRow>()) { dataGridView1.Rows.Remove(row); } |
Marko
AlexMack - Mo 10.01.11 08:45
Das Problem ist nicht die Gridview... das ist nur der Datencontainer. Wenn ich die Zeilen im Gridview lösche, dann tauchen sie im nächsten rebuild der Tabelle wieder auf und das ist nicht sinn und zweck der übung... übrigens hat dein einwurf das problem anders beleuchtet. Der Commandmanager setzt die Parameter auf null zurück... vielleicht muss der aus der schleife und die ganze Löschprozedur abinitio ausführen.... ja, so funktioniert das
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!