2009-12-15 12 views
1

Ce que j'ai est deux listes de sélection.C# liste de sélection multiple déplacer déplacer

Dans listbox1, je souhaite que l'utilisateur puisse cliquer sur un bouton et déplacer tous les éléments sélectionnés vers la zone de liste deux. Aussi, s'il n'y a rien sélectionné, je ne veux pas que le bouton fonctionne. Quelqu'un a des suggestions?

listbox1.items.add (listbox2.selecteditems); se déplace juste (collection) à la 2ème liste.

Répondre

3

Je suppose que vous devez déplacer les éléments séparément:

List<object> itemsToRemove = new List<object>(); 

foreach (var item in listbox2.SelectedItems) 
{ 
    listbox1.Items.Add(item); 
    itemsToRemove.Add(item); 
} 

foreach (var item in itemsToRemove) 
{ 
    listbox2.Items.Remove(item); 
} 

Ceci va déplacer tous les éléments sélectionnés de listbox2 à listbox1. La liste itemsToRemove est utilisée comme stockage temporaire car vous ne pouvez pas modifier une collection pendant qu'elle itère sur elle; pendant l'itération, nous ajoutons simplement des références aux éléments à supprimer dans une liste temporaire, puis nous parcourons cette liste et supprimons les éléments.

Afin de gérer le cas où aucun élément sont sélectionnés, je mis en place un gestionnaire d'événements pour l'événement SelectedIndexChanged, et définissez la propriété Enabled du bouton:

theButton.Enabled = (listbox2.SelectedItems.Count > 0); 
+0

Bonne idée, j'ai oublié de les retirer de la liste initiale. – hometoast

0

pour Winforms:

foreach (var i in listbox1.SelectedItems) { 
    listbox2.SelectedItems.add(i); 
} 

Pour activer le bouton uniquement lorsque le code nécessaire ajouter à l'événement OnSelectionChanged et mettre button1.enabled = (Listbox1.SelectedItems.Count > 0);

0
if (listbox1.SelectedItems.Count == 0) 
{ 
    return; 
} 

// Do this if you want to clear the second ListBox 
listbox2.Items.Clear(); 

foreach (object obj in listbox1.SelectedItems) 
{ 
    listbox2.Items.Add(obj); 
} 
0

Pour listbox1 utiliser le SelectedItemChanged événement et utilisez vos EventArgs fournis pour obtenir l'élément sélectionné -> puis ajoutez à listbox2.

Si aucun élément n'est sélectionné button.enbabled = false;

1

Voici une solution LINQ:

private void buttonMove_Click(object sender, EventArgs e) 
{ 
    foreach (var item in listBox1.SelectedItems.OfType<object>().ToArray()) 
    { 
     listBox1.Items.Remove(item); 
     listBox2.Items.Add(item); 
    } 
} 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    buttonMove.Enabled = listBox1.SelectedItems.Count > 0; 
} 
+0

+1, Le '.ToArray()' est important, donc vous ne modifiez pas la collection pendant 'foreach'. – user7116