2009-05-18 10 views
8

J'ai une liste déroulante à sélection multiple que je lie à un DataTable. DataTable contient 2 colonnes description et valeur.Définition de l'élément sélectionné dans une ListBox sans bouclage

est ici le code peuplant listbox:

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

Je suis en train de la description que DisplayMember et valeur que la ValueMember du ListBox. Maintenant, en fonction de ce que la valeur est passée, j'ai besoin de définir l'élément sélectionné dans le ListBox.

Voici mon code:

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

qui ne fonctionne pas. Par conséquent, je dois recourir au code ci-dessous (où je boucle à travers tous les éléments de la liste)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

Je voudrais savoir ce qui manque/erreur dans mon code. Pourquoi lb.SelectedValue = valuePassedByUser; sélectionner des éléments incorrects?

+0

Pouvez-vous donner plus d'informations sur ce que vous devez faire exactement ou un exemple plus complet du code? L'objet est-il capable de lire un champ d'une base de données et de définir l'index/valeur sélectionné sur une valeur correspondante dans la liste? – ryanulit

+0

La zone de liste est remplie avec un DataTable qui à son tour a récupéré des données de la base de données. Ma préoccupation est que si j'ai défini ValueMember en remplissant la liste, pourquoi lb.SelectedValue = valuePassedByUser; ne fonctionne pas? –

Répondre

7

Ok ... voici une réponse difficile à digérer que j'ai réalisée hier seulement. C'est mon erreur cependant que je n'ai pas mentionné une chose importante dans ma question parce que je pensais que ce n'est pas pertinent au problème à portée de main:

Les données dans la table de données n'a pas été triée. Par conséquent, je avait défini la propriété Sorted de la listbox à true. Plus tard, j'ai réalisé que lorsque la propriété triée de la liste déroulante ou même de la liste déroulante est définie sur true, le membre de valeur n'est pas défini correctement. Donc, si je vous écris:

lb.SelectedValue = valuePassedByUser;

il définit un autre élément comme choisi plutôt que settting celui dont la valeur est valuePassedByUser. Bref, ça gâche les index.

Par exemple. si mes données initiales sont:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

Et j'ai défini trié = true. Ensuite, les articles listbox sont:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

Maintenant, si je veux mettre la banane comme sélectionné, je lance le stmt:

lb.SelectedValue = "B";

Mais au lieu de mettre en banane comme sélectionné, il définit Orange comme sélectionné. Pourquoi? Parce que si la liste n'avait pas été triée, l'indice de Banana serait de 4. Donc, même après avoir trié l'index de Banana est 2, il met l'index 4 comme sélectionné, rendant ainsi Orange sélectionné à la place de Banana.

Par conséquent, pour listbox Sorted, je me sers du code suivant pour définir les éléments sélectionnés:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

Essayez ceci: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+2

Il n'y a pas de FindByValue dans la collection Items. – norlando

1

Je pense que la seule façon que vous serez en mesure de sélectionner plusieurs éléments est à l'aide d'une boucle foreach. La propriété SelectedValue semble uniquement renvoyer 1 élément. Si vous voulez sélectionner plus de 1 point vous devrez utiliser:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

De plus, le FindStringExact ne recherche pas à travers les champs de valeur, il ne regarde que par le texte affiché. Aussi, pour réduire le code, vous pouvez lancer une nouvelle variable comme une listbox afin de ne pas continuer à lancer C comme une liste.

0

Vous pouvez utiliser "FindByValue" comme ceci:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

Voilà comment je résolu à l'aide de winforms, DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

Si vous ne souhaitez pas mettre en boucle les éléments sélectionnés, extraire la valeur sélectionnée de la zone de liste de l'événement listBox_SelectedIndexChanged et ajouter cette valeur dans le tableau global. Ensuite, en accédant à ce tableau, vous obtiendrez la valeur des éléments désirés de itemlist sans aucune boucle.