2016-08-03 29 views
0

Ich habe nach einer Antwort gesucht, und obwohl es eine gibt, die funktioniert, wenn eine Listbox mit Elementen vom Typ String verwendet wird, kann ich nicht herausfinden, wie konvertiert werden soll meine Einzelteile sind vom TypC# WinForms ListBox Inkrementelle Suche mit Schlüssel-/Wertpaaren als ListItems

KeyValuePair<string, ChangeRec> 

ich, als ich in der Listbox (nicht ComboBox verwenden, da die Steuerung benötigt werden, um eine bestimmte Größe auf dem Formular), auf der Suche nach dem Schlüssel (Text) geben können, suchen möge Artikel. Danke an @Marcel Popescu für den Startpunkt. Hier ist meine Version des Codes (haben nur über die Linie kommentiert, wo sie versagt, wie es zu Recht nicht ein KVP Artikel als String werfen kann):

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

Wie füllen Sie die ListBox? Dieser Code ist wichtig, um zu verstehen, was hier nicht funktioniert. – Steve

+0

Entschuldigung, ich habe vergessen, diese Informationen aufzunehmen. Die Daten (ein Wörterbuch) sind an die Datenquelle des Steuerelements gebunden, und das DisplayMember-Objekt ist auf "Key" festgelegt, wobei ValueMember auf "Value" festgelegt ist. Die Daten werden aus einer Textdatei gelesen. Der Elementschlüssel ist ein Dateiname und der Elementwert ist ein Objekt, das alle Informationen zu dieser Datei enthält. – MartinS

Antwort

1

verwenden, gehe ich davon aus es ist die Key von KeyValuePair dass Sie durchsuchen möchten:

//* 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; 

Als KeyValuePair ein Werttyp ist, kann es nicht immer null sein. Um herauszufinden, ob ein Wert zugewiesen wurde, prüfen wir mit item.Equals(default(KeyValuePair<string, ChangeRec>))

+0

Ich versuchte das, aber verpasste, dass ich KeyValuePair in der Besetzung verwenden musste. Vielen Dank. Ich erhalte jetzt einen Fehler in der nächsten Zeile (if (item == null) return;), weil der kvp nicht mit null verglichen werden kann. – MartinS

+0

@MartinS Ich habe die Antwort aktualisiert. – sachin

+0

Perfekt, das ist es sortiert. Danke vielmals. – MartinS