2016-02-02 2 views
-1

Мне нужно копировать элементы из спискаbox1 в Listbox2. Я использую этот фрагмент кода MOVE. Для единственного элемента (btnAdd1) я просто закомментирую строку «Удалить», и все работает так, как ожидалось. Однако для множественного select (btnAdd2), если я прокомментирую строку «Удалить», программа зависает ... однако, если я ее оставлю, она работает. Есть идеи?C# Listbox Копировать не перемещать

private void btnAdd1_Click_1(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedIndex == -1) 
     { 
      MessageBox.Show("Please Select an Item"); 
     } 
     else 
     { 
      if (!listBox2.Items.Contains(listBox1.SelectedItem)) 
      { 
       listBox2.Items.Add(listBox1.SelectedItem); 
      } 
     } 
    } 

    private void btnAdd2_Click(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedIndex == -1) 
     { 
      MessageBox.Show("Please Select Multiple Items"); 
     } 
     else 
     { 
      while(listBox1.SelectedItems.Count != 0) 
      { 
       if (!listBox2.Items.Contains(listBox1.SelectedItem)) 
       { 
        listBox2.Items.Add(listBox1.SelectedItems[0]); 
        // If this line is missing, the program hangs 
        listBox1.Items.Remove(listBox1.SelectedItems[0]); 
       } 
      } 
     } 
    } 
+0

Вы должны запустить его в отладчике, чтобы быть уверенным, но я подозреваю, что 'в то время как (listBox1.SelectedItems.Count! = 0)' никогда не становится ложным по какой-то причине. Либо это, либо удаление элемента из списка не вынимает его из коллекции 'SelectedItems'. –

ответ

0

У вас есть цикл while. условие для цикла while будет истинным, если вы удалите эту строку. ваш код должен быть таким:

foreach(var item in listbox1.SelectedItems) 
if (!listbox2.items.contain(item) 
    listbox2.items.add(item); 
+0

Но тогда элемент не удаляется из 'listbox1', и, вероятно, удаление элемента приведет к аннулированию' foreach', поскольку базовая коллекция будет изменена. –

+0

Измените мой foreach на и подсчитайте сверху вниз. Я забыл, что ты хочешь двигаться. но и простой. Это требует немного изменений –

0

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

private void btnAdd2_Click(object sender, EventArgs e) 
    { 
     if (listBox1.SelectedIndex == -1) 
     { 
      MessageBox.Show("Please Select Multiple Items"); 
     } 
     else 
     { 
      if (!listBox2.Items.Contains(listBox1.SelectedItem)) 
      { 
       foreach (var item in listBox1.SelectedItems) 
       { 
        listBox2.Items.Add(item); 
       } 
      } 
     } 
    } 
Смежные вопросы