2014-02-06 189 views
0

我有一個綁定到對象列表的下拉列表。該列表可以有超過20000個項目。我不想立即填充列表。但是,當用戶鍵入列表的文本部分時,控件應該開始過濾列表並顯示匹配的項目。篩選下拉列表

我嘗試以下操作:

private void cboName_TextChanged(object sender, EventArgs e) 
    { 
     var query1 = allNames.Where(x => x.firstname.Contains(cboName.Text) || x.lastname.Contains(cboName.Text)).ToList(); 

     cboName.DataSource = query1; 
     cboName.ValueMember = "id"; 
     cboName.DisplayMember = "firstname"; 
    } 

但它不能正常工作性能,明智的。 有沒有辦法做到這一點?

+0

數據源是數據庫嗎? –

+0

編號列表我從JSON文件填充。 –

+0

您可以添加一個eventlistener,它將使用用戶在文本部分中鍵入的值來獲取數據。過濾後,您可以將獲取的數據綁定到該下拉列表。編輯:在看到你做了什麼後,你可以通過僅獲得前20個結果來提高性能? – sander

回答

1

您的需求,你可以嘗試這個

TextBox.AutoCompleteMode Property

例子:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Create the list to use as the custom source. 
    var source = new AutoCompleteStringCollection(); 
    source.AddRange(new string[] 
        { 
         "January", 
         "February", 
         "March", 
         "April", 
         "May", 
         "June", 
         "July", 
         "August", 
         "September", 
         "October", 
         "November", 
         "December" 
        }); 

    // Create and initialize the text box. 
    var textBox = new TextBox 
        { 
         AutoCompleteCustomSource = source, 
         //Appends both Suggest and Append options. 
         AutoCompleteMode = 
          AutoCompleteMode.SuggestAppend, 
         AutoCompleteSource = 
          AutoCompleteSource.CustomSource, 
         Location = new Point(20, 20), 
         Width = ClientRectangle.Width - 40, 
         Visible = true 
        }; 

    // Add the text box to the form. 
    Controls.Add(textBox); 
} 
+0

這個建議幾乎完美。唯一的問題是匹配是從字符串的開頭進行的,而不是從字符串中的任何位置進行。 –

0

你可以用你的代碼,你已經堅持。

private void cboName_TextChanged(object sender, EventArgs e) 
    { 
     var query1 = allNames.Where(x => x.firstname.Contains(cboName.Text) || x.lastname.Contains(cboName.Text)).ToList(); 

     cboName.DataSource = query1; 
     cboName.ValueMember = "id"; 
     cboName.DisplayMember = "firstname"; 
    } 

您可以設置延遲,您篩選之前,或使用​​用聽enter密鑰和過濾列表。