2017-02-06 3 views
-1

У меня есть tabcontrol (WinForm) с кнопкой «Закрыть все вправо», которая работает отлично. Теперь я занят «Закрыть все слева». Я взял несколько строк «Справа справа» и соответствующим образом изменил его, но по какой-то неизвестной и необъяснимой причине он не работает должным образом.Закройте все вкладки слева

Из выбранного файла он закрывает все вкладки, но когда я заменяю строку, которая удаляет вкладки с помощью MessageBox, я получаю правильный вывод. Ниже мой код.

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()); 
     } 
    } 
} 

Ниже «Закрыть все нужное» код работает

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

Подсказка: это может иметь какое-то отношение к .Remove внутри инструкции foreach. Вы меняете коллекцию, когда цикл foreach ожидает, что коллекция будет неизменной. –

+0

Привет Натан. Извини, я не с тобой сейчас. Из моих ограниченных знаний о C# .Remove должно быть внутри оператора foreach, чтобы иметь возможность удалять все вкладки слева. Код для «Закрыть все вправо» работает 100% –

+0

Пожалуйста, взгляните на эту статью переполнения стека. http://stackoverflow.com/questions/7193294/intelligent-way-of-removing-items-from-a-listt-while-enumerating-in-c-sharp Вы можете публиковать точная ошибка, которую вы получаете ? –

ответ

2

Позвольте мне объяснить проблему вы столкнулись. Допустим, у вас есть 4 вкладки: 1, 2, 3 и 4 и вы хотите удалить все вкладки слева от третьей вкладки. Вы начинаете выполнять итерацию по вкладкам. Когда вы удаляете первую вкладку, то, что вы оставили, являются вкладками с индексами 2, 3, 4 справа? Нет. Они изменили свои индексы и теперь теперь 1, 2 и 3. Вы удаляете следующую вкладку. Он также является индексом, который меньше 3. И цикл продолжается до тех пор, пока вы не удалите все вкладки.

Вместо повторения и удаления вы должны сначала перебрать вкладки и добавить вкладки, которые хотите удалить, во временную коллекцию. После того, как вы закончите, вы удаляете каждую вкладку из этой коллекции.

+0

Спасибо, зеленый. Это имеет смысл сейчас. Не могли бы вы указать мне сейчас в правильном направлении. Вводя его в массив, а затем удалить его? –

+0

@SuzanneCoetzee вам следует попробовать сделать это самостоятельно, и я могу исправить ошибки. На самом деле это не так сложно. – greenshade

+0

Непросто идти на север, трудно узнать, где находится север –

Смежные вопросы