2016-08-03 3 views
0

私は答えを探していましたが、string型の項目を持つリストボックスを使用するときに機能するものがありますが、私のアイテムは、私は、キー(テキスト)で検索、(コントロールは、フォーム上の特定のサイズにする必要があるとして、コンボボックスを使用することはできません)私はリストボックスに入力すると、検索できるようにしたいタイプC#WinForms ListBox ListItemsとしてキー/値ペアを使用したインクリメンタル検索

KeyValuePair<string, ChangeRec> 

であります項目。出発点として@Marcel Popescuに感謝します。ここでは、コードの私のバージョンは、(それは当然の文字列としてのkVp項目をキャストすることはできませんとして、唯一それが失敗した線の上にコメントしている)だ:

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

ListBoxをどのように埋めるのですか?そのコードは、ここで働いていないものを理解するために不可欠です。 – Steve

+0

謝罪、私はその情報を含めるのを忘れてしまった。データ(辞書)はコントロールのデータソースにバインドされ、DisplayMemberはKeyに設定され、ValueMemberはValueに設定されます。データはテキストファイルから読み込まれます。項目キーはファイル名であり、項目値はそのファイルのすべての情報を含むオブジェクトです。 – MartinS

答えて

1

は、これを使用して、私はそれがKeyValuePairKeyであると仮定しています検索する文字列:

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

KeyValuePairは値型なので、nullにすることはできません。値が割り当てられているかどうかを調べるには、item.Equals(default(KeyValuePair<string, ChangeRec>))

+0

私はそれを試してみましたが、キャスト内でKeyValuePair を使う必要があるのを見逃しました。ありがとう。 kvpをnullと比較できないため、次の行でエラーが発生します(if(item == null)return;)。 – MartinS

+0

@MartinS私は答えを更新しました。 – sachin

+0

パーフェクト、それはそれをソートしました。どうもありがとう。 – MartinS

関連する問題