2010-03-13 3 views
1

J'ai 2 zones de liste et je souhaite pouvoir copier les éléments sélectionnés de l'un à l'autre autant de fois que je le souhaite. Ive réussi à le faire mais j'ai des boutons sur la 2ème zone de liste qui me permettent d'aller de haut en bas .. Maintenant, quand theres aux éléments dans la deuxième zone de liste qui sont les mêmes (par exemple "branchies" et "branchies") il doesnt se comporter normalement et se bloque.Clonage d'éléments dans une zone de liste C#

Y a-t-il un moyen de les faire agir comme des éléments séparés dans la 2nd listbox?

Code

private void buttonUp_Click(object sender, EventArgs e) 
    { 
     object selected = listBox2.SelectedItem; 
     int index = list2.Items.IndexOf(selected); 

     listBox2.Items.Remove(selected); 
     listBox2.Items.Insert(index - 1, selected); 
     listBox2.SetSelected(index - 1, true); 
    } 

    private void buttonAdd_Click(object sender, EventArgs e) 
    {   
     DataRowView selected = (DataRowView)listBox1.SelectedItem;    
     string item = selected["title"].ToString(); 
     listBox2.Items.Add(item); 

    } 

Il fonctionne très bien quand je havnt obtenu des doublons, mais quand je fais ils sautent juste au hasard quand je presse haut/bas.

(ive pas inclus vers le bas comme à peu près le même que vers le haut)

+0

Quelle est l'erreur en cas de panne? – Turnkey

+0

Il "plante" ... de manière trop générale. Quelle est l'exception et la trace de la pile? Publiez également votre code de gestion des événements de bouton. –

+0

Vous n'avez pas posté suffisamment d'informations pour obtenir une réponse définitive. Je suppose que vous faites le traitement basé sur la chaîne réelle dans les cas où vous devriez compter plus sur l'index de l'élément dans la liste. –

Répondre

0

Juste le code, parce que le reste des réponses couvrent toute façon:

private void buttonAdd_Click(object sender, EventArgs e) 
    { 

     DataRowView selected = listBox1.SelectedItem as DataRowView; 
     if (selected != null) 
     { 
      string item = selected["title"].ToString(); 
      listBox2.Items.Add(item); 
     } 
    } 

    private void buttonUp_Click(object sender, EventArgs e) 
    { 
     string selected = listBox2.SelectedItem as string; 
     int oldIndex = listBox2.SelectedIndex; 
     int newIndex = oldIndex; 

     if (!string.IsNullOrEmpty(selected) && listBox2.Items.Count > 1 && oldIndex > 0) 
     { 
      listBox2.SuspendLayout(); 

      listBox2.Items.RemoveAt(oldIndex); 
      newIndex = oldIndex - 1; 
      listBox2.Items.Insert(newIndex, selected); 
      listBox2.SelectedIndex = newIndex; 

      listBox2.ResumeLayout(); 

     } 
    } 
+0

J'étais prématuré sur le dernier montage. –

0

Vous pouvez utiliser SelectedIndex au lieu de SelectedItem lorsque vous avez plusieurs éléments qui sont tous égaux. Je recommande également de vérifier que ce n'est pas -1.

0

Le problème pour le cas échéant est le jeu de code suivant.

object selected = listBox2.SelectedItem; 
int index = list2.Items.IndexOf(selected); 

Ce code ne fonctionnera correctement si vous avez des articles uniques dans la liste. Une fois que vous avez des éléments en double, la valeur index sera l'index de la première instance de dire gills dans la liste et pas nécessairement l'index de la valeur sélectionnée. Il semble que vous reflétez les articles dans listBox2 et list2. Si tel est le cas, vous pouvez simplement utiliser la propriété SelectedIndex directement sur listBox2 puisque l'index sera égal dans les deux liss.

int index = listBox2.SelectedIndex; 
0

Si vous essayez d'utiliser une liste d'objets, essayez d'implémenter Iclonnable. Cela fera des copies du même article sur & plus de. Notez également que pour déplacer un élément en haut ou en bas, vous ne devez pas supprimer l'élément de la liste & et réinsérez-le. Mais vous pouvez changer l'index de l'article. J'espère que cela t'aides.

+0

"Pour déplacer un élément vers le haut ou vers le bas, vous n'avez pas besoin de supprimer l'élément de la liste et de le réinsérer, mais vous pouvez modifier l'index de l'élément." Comment déplacez-vous un élément dans un contrôle ListBox en modifiant l'index des éléments? Il n'y a aucune propriété ou méthode disponible à faire que je sache. Au moins, pas lié de cette façon. –

1

Il semble que vous voyagiez autour du monde pour faire quelque chose de simple. Je voudrais aborder cela en utilisant la liste et la liaison de données de la liste.

// Add code 
     DataRowView selected = listBox1.SelectedItem as DataRowView; 
     if (selected != null) 
     { 
      _myList.Add(selected); // Adds at end 
      BindList2(); 
     } 

// Move up code 
    int selectedIndex = listBox2.SelectedIndex; 
    if(selectedIndex > 0) 
    { 
     var temp = _myList[selectedIndex]; 
     _myList.Remove(temp); 
     _myList.InsertAt(selectedIndex - 1, temp); 
     BindList2(); 
    } 

// BindList2 
public void BindList2() 
{ 
    listBox2.DataSource = _myList; 
    listBox2.DataBind(); 
} 
Questions connexes