2016-08-03 5 views
0

문자열 형식의 항목과 함께 목록 상자를 사용할 때 대답을 검색했습니다. 변환 방법을 알 수 없습니다. 내 항목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