2017-05-06 6 views
0

이것은 C# - WinForm 질문입니다. listBox에서 검색하려고합니다. 하나의 목록 상자에 일부 항목으로 가득 차 있습니다. 프로그램로드시 listBox의 모든 항목이 'tempList'라는 유형 문자열 목록에 복사됩니다. TextBox도 있습니다. 사용자가 TextBox에 입력을 시작하면 listBox는 Clear() 메서드를 사용하여 지워집니다. 그 후 텍스트 상자의 단어는 foreach 블록을 사용하여 tempList에서 검색됩니다. 모든 일치 항목은 listBox에 추가되어 사용자에게 표시됩니다. 이 코드를 내놓았다 :backgroundWorker를 사용하여 목록 상자에서 검색

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     listBox1.Items.Clear(); 
     foreach (string item in tempList) 
     { 
      if (item.ToLower().Contains(textBox1.Text.ToLower())) 
      { 
       listBox1.Items.Add(item); 
      } 
     } 
    } 

문제는 사용자가 첫 번째 문자, 텍스트 상자에 입력하기 시작하면, UI 나누기와 사용자가 해당에 대한 검색 때까지 ​​기다려야 가지고있다 한 문자가 완료되면 다시 입력 할 수 있으며 모든 문자와 함께 발생합니다. 이를 해결하기 위해 backgroundWorker를 사용할 수 있다고 생각했습니다. 그러나 나는이 시나리오를 위해 그것을 어떻게 사용하는지 이해하지 못한다. 도움이되는 모든 것이 인정 될 것입니다. 사용이 BackgroundWorker 구성 클래스 ...

선언 ...

BackgroundWorker listSearch = new BackgroundWorker(); 

초기화

+0

다른 인터페이스로 자동 완성 기능을 복제하려는 것 같습니다. 이미 내장 된 UI 기능을 사용하지 않는 이유는 무엇입니까? – Steve

+0

자동 완성은 사용자가 타이핑하고 텍스트 상자의 내용에 추가 할 때 단어를 제안하는 것으로 추측합니까? 그게 내 의도가 아니야. 나는 특별히 listBox에서 텍스트 상자에 입력 된 단어를 검색하려고합니다. – arm

+0

사용자가 텍스트 상자를 떠난 후에 만 ​​검색을 시작하거나 '입력'을 눌러야합니다. – Fabio

답변

0

...

 listSearch.DoWork += ListSearch_DoWork; 
     listSearch.RunWorkerCompleted += ListSearch_RunWorkerCompleted; 

이벤트 핸들러 구현 ...

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     listSearch.RunWorkerAsync(textBox1.Text); 
    } 

    private void ListSearch_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string text = e.Argument as string; 
     List<string> items = new List<string>(); 
     foreach (string item in tempList) 
     { 
      if (item.ToLower().Contains(text.ToLower())) 
      { 
       items.Add(item); 
      } 
     } 
     e.Result = items.ToArray(); 
    } 

    private void ListSearch_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     string[] items = e.Result as string[]; 
     Invoke((Action)(() => 
     { 
      listBox1.Items.Clear(); 
      foreach(string item in items) 
      { 
       listBox1.Items.Add(item); 
      } 
     })); 
    } 
+0

놀라워요! 그 작품은 내가 원했던 것과 똑같습니다. 너에게 충분히 감사 할 수 없다. – arm

+0

주 : 실행 작업자 완료 핸들러의 호출은 불필요합니다. 방금 작업 한 작업자는 항상 백그라운드 작업자가 생성 된 동일한 스레드에서 실행됩니다. 그래서 당신은 조금 단순화 할 수 있습니다. – AQuirky

0

의 사용클래스는 BackgroundWorker보다 훨씬 쉽습니다. 코드를 단순화하기 위해 바인딩

private async void TextBox_TextChanged(object sender, EventArgs e) 
{ 
    listBox.DataSource = null; 

    var task = Task.Run(() => 
     { 
      var resultList = new List<string>(); 

      foreach (string item in tempList) 
       if (item.ToLower().Contains(textBox.Text.ToLower())) 
        resultList.Add(item); 

      return resultList; 
     }); 

    listBox.DataSource = await task; 
} 

사용 데이터 :

이 간단한 해결책을 시도해보십시오. 프로그램로드시

listBox.DataSource = tempList;