2016-04-10 2 views
-1

У меня есть вид сетки данных, который используется для привязки значений.Autocomplete для DatagridView ComboBox

У меня есть ComboBox внутри этого DatagridView; Я хочу реализовать свойство auto complete в этом ComboBox. Она должна не только поиск по первой букве, но и весь пункт ...

ответ

0

Это может быть сделано путем

  • Схватив ComboBox
  • манипулируя Items

Предположим, у вас есть только один ComboBoxColumn; то вы можете получить экземпляр текущего, как это:

ComboBox editCombo = null; // class level variable 


private void dataGridView1_EditingControlShowing(object sender, 
       DataGridViewEditingControlShowingEventArgs e) 
{ 
    editCombo = e.Control as ComboBox; 
    if (editCombo != null) 
    { 
     // here we can set its style.. 
     editCombo.DropDownStyle = ComboBoxStyle.DropDown; 
     editCombo.AutoCompleteMode = AutoCompleteMode.Suggest; 
     // sigh..: 
     editCombo.TextChanged -= editCombo_TextChanged; 
     editCombo.TextChanged += editCombo_TextChanged; 
    } 
} 

Давайте предположим, что у вас есть действительный список значений в List<string>

List<string>() allChoices = new List<string>(); 

Тогда мы можем адаптировать Items быть показано в TextChanged событие:

void editCombo_TextChanged(object sender, EventArgs e) 
{ 
    List<String> items = allChoices.Select(x=>x) 
            .Where(x=>x.Contains(editCombo.Text)).ToList(); 

    if (items.Count > 0) 
    { 
     editCombo.Items.Clear(); 
     editCombo.Items.AddRange(items.ToArray()); 
    } 
    editCombo.Select(editCombo.Text.Length, 0); //clear the selection 
} 

Обратите внимание, что это x=>x.Contains(editCombo.Text) поиск предметов, которые содержат введен полный текст. Надеюсь, это то, что вы имеете в виду; поиск предметов, которые являются идентичными, к введенному тексту не имеет смысла, так как тогда вам не нужно автозаполнять их в любом случае ..