2016-08-03 2 views
0

J'ai cherché une réponse, et bien qu'il y en ait une qui fonctionne quand j'utilise une listbox avec des éléments de type chaîne, je n'arrive pas à comprendre comment la convertir mes articles sont de typeC# WinForms ListBox Recherche incrémentielle avec des paires clé/valeur comme ListItems

KeyValuePair<string, ChangeRec> 

Je veux être en mesure de rechercher que je tape dans la liste (ne peut pas utiliser ComboBox que le contrôle doit être une taille spécifique sur la forme), la recherche par la clé (texte) article. Merci à @Marcel Popescu pour le point de départ. Voici ma version du code (ont commenté seulement au-dessus de la ligne où elle échoue, car il à juste titre ne peut pas lancer un élément de kvp sous forme de chaîne):

private string searchString; 
private DateTime lastKeyPressTime; 

private void lbElementNames_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    this.IncrementalSearch(e.KeyChar); 
    e.Handled = true; 
} 

private void IncrementalSearch(char ch) 
{ 
    if ((DateTime.Now - this.lastKeyPressTime) > new TimeSpan(0, 0, 1)) 
    { 
     this.searchString = ch.ToString(); 
    } 
    else 
    { 
     this.searchString += ch; 
    } 
    this.lastKeyPressTime = DateTime.Now; 
    //* code falls over HERE *// 
    var item = 
     this.lbElementNames.Items.Cast<string>() 
      .FirstOrDefault(it => it.StartsWith(this.searchString, true, CultureInfo.InvariantCulture)); 

    if (item == null) return; 
    var index = this.lbElementNames.Items.IndexOf(item); 
    if (index < 0) return;   
    this.lbElementNames.SelectedIndex = index; 
} 
+0

Comment remplir la ListBox? Ce code est essentiel pour comprendre ce qui ne fonctionne pas ici. – Steve

+0

Excuses, j'ai oublié d'inclure cette information. Les données (un dictionnaire) sont liées à la source de données du contrôle et DisplayMember est défini sur Key, l'élément ValueMember étant défini sur Value. Les données sont lues à partir d'un fichier texte. La clé de l'élément est un nom de fichier et la valeur de l'élément est un objet qui contient toutes les informations sur ce fichier. – MartinS

Répondre

1

Utilisez ce, je suppose qu'il est le Key de KeyValuePair que vous voulez chercher dans:

//* code falls over HERE *// 

var item = 
     this.lbElementNames.Items.Cast<KeyValuePair<string, ChangeRec>>() 
      .FirstOrDefault(it => it.Key.StartsWith(this.searchString, true, CultureInfo.InvariantCulture)); 

if (item.Equals(default(KeyValuePair<string, ChangeRec>))) return; 

Comme KeyValuePair est un type de valeur, il ne peut jamais être null. Pour savoir si une valeur lui a été affectée, nous vérifions en utilisant item.Equals(default(KeyValuePair<string, ChangeRec>))

+0

J'ai essayé mais j'ai manqué d'utiliser KeyValuePair dans la distribution. Merci. Je reçois une erreur sur la ligne suivante maintenant (if (item == null) return;) parce que le kvp ne peut pas être comparé à null. – MartinS

+0

@MartinS J'ai mis à jour la réponse. – sachin

+0

Parfait, c'est réglé. Merci beaucoup. – MartinS