2017-02-06 6 views
-1

Ich habe eine tabcontrol (WinForm) mit einem Button "Close all nach rechts", die perfekt funktioniert. Jetzt bin ich beschäftigt mit "Alle nach links schließen". Ich nahm die paar Zeilen von "Close to the right" und änderte sie entsprechend, aber aus unbekannten und unerklärlichen Gründen funktioniert es nicht so, wie es sollte.Alle TabPages links schließen

Von der ausgewählten Registerkarte schließt es alle Registerkarten, aber wenn ich die Zeile ersetzen, die die Registerkarten mit einer MessageBox entfernen, dann bekomme ich die richtige Ausgabe. Unten ist mein Code.

tabpagenumber = (tabControl1.SelectedIndex+1); 

if (tabControl1.TabCount > 1) 
{ 
    TabControl.TabPageCollection tabcoll = tabControl1.TabPages; 
    foreach (TabPage tabpage in tabcoll) 
    { 
     tabControl1.SelectedTab = tabpage; 
     if ((tabControl1.SelectedIndex+1) < tabpagenumber) 
     { 
      tabControl1.TabPages.Remove(tabpage); 
      // MessageBox.Show(tabpagenumber.ToString()); 
     } 
    } 
} 

Below "Schließen Sie alle auf der rechten Seite" Code

arbeitet mir
pagenumber = (tabControl1.SelectedIndex + 1); 

if (tabControl1.TabCount > 1) 
{ 
    TabControl.TabPageCollection tabcoll = tabControl1.TabPages; 
    foreach (TabPage tabpage in tabcoll) 
    { 
     tabControl1.SelectedTab = tabpage; 

     int testb = tabControl1.TabCount; 

     if (pagenumber < (tabControl1.SelectedIndex + 1)) 
     { 
      // closeToolStripMenuItem_Click(sender, e); 

      tabControl1.TabPages.Remove(tabpage); 
     } 
    } 
} 
+2

Hinweis: Es kann etwas damit zu tun haben, dass die .Remove innerhalb der Foreach-Anweisung ist. Sie ändern die Auflistung, wenn die Foreach-Schleife erwartet, dass die Auflistung unveränderbar ist. –

+0

Hallo Nathan. Entschuldigung, ich bin jetzt nicht bei dir. Aus meinen begrenzten Kenntnissen von C# sollte der .Remove innerhalb der foreach-Anweisung sein, um alle Tabs auf der linken Seite entfernen zu können. Code für "Close all to the right" funktioniert 100% –

+0

Bitte werfen Sie einen Blick auf diesen Stapelüberlauf Artikel. http://stackoverflow.com/questions/7193294/intelligent-way-of-removing-items-from-a-listt-while-enumerating-in-c-sharp Sind Sie in der Lage, den genauen Fehler, den Sie erhalten, zu buchen ? –

Antwort

2

Lassen Sie das Problem erklären Sie konfrontiert sind. Nehmen wir an, Sie haben 4 Registerkarten: 1, 2, 3 und 4 und Sie möchten alle Registerkarten auf der linken Seite der dritten Registerkarte entfernen. Sie beginnen, über Registerkarten zu iterieren. Wenn Sie die erste Registerkarte entfernen, was Sie übrig haben sind Registerkarten mit Indizes 2, 3, 4 Recht? Nein. Sie haben ihre Indizes geändert und jetzt sind es 1, 2 und 3. Sie löschen die nächste Registerkarte. Sein Index ist auch einer, der weniger als 3 ist. Und der Zyklus wird fortgesetzt, bis Sie alle Registerkarten löschen.

Anstatt zu iterieren und zu löschen, sollten Sie zunächst die Registerkarten durchlaufen und die Registerkarten hinzufügen, die Sie in eine temporäre Sammlung löschen möchten. Nachdem Sie fertig sind, löschen Sie alle Registerkarten aus dieser Sammlung.

+0

Danke Grünschatten. Dies macht jetzt Sinn. Kannst du mir bitte jetzt in die richtige Richtung zeigen? Setzen Sie es in ein Array und löschen Sie es dann? –

+0

@SuzanneCoetzee sollten Sie versuchen, es selbst zu tun und ich kann Ihre Fehler später beheben. Es ist nicht so schwer, wirklich. – greenshade

+0

Es ist nicht schwer nach Norden zu gehen, es ist schwer zu wissen, wo Norden ist –

Verwandte Themen