Я знаю, что это старая тема, но я так старался найти решение для фильтрации автозаполнения в c # и не смог найти ничего, поэтому я придумал свой собственный простой и легкий способ, поэтому я просто поделюсь им кто может думать, что это полезно и хочет использовать в своих проектах. Он не использует функции автозаполнения элемента управления. Что он делает, просто получает текст, введенный из поля со списком, ищет его в источнике, а затем отображает только совпадающие из источника как новый источник списка. Я реализовал это в событии combobox 'KeyUp
.
Допустим (на самом деле это то, что я делаю почти во всех случаях, когда я хочу автозаполнение), у нас есть глобально назначенный DataTable
, называемый dt_source, как источник комбинированного списка, и он имеет два столбца: id (int) и name (строка).
DataTable dt_source = new DataTable("table");
dt_source.Columns.Add("id", typeof(int));
dt_source.Columns.Add("name", typeof(string));
И вот как выглядит мой метод KeyUp:
private void cmb_box_KeyUp(object sender, KeyEventArgs e)
{
string srch = cmb_box.Text;
string srch_str = "ABackCDeleteEFGHIJKLMNOPQRSpaceTUVWXYZD1D2D3D4D5D6D7D8D9D0";
if (srch_str.IndexOf(e.KeyCode.ToString()) >= 0)
{
cmb_box.DisplayMember = "name"; // we want name list in the datatable to be shown
cmb_box.ValueMember = "id"; // we want id field in the datatable to be the value
DataView dv_source = new DataView(dt_source); // make a DataView from DataTable so ...
dv_source.RowFilter = "name LIKE '%"+ srch +"%'"; // ... we can filter it
cmb_box.DataSource = dv_source; // append this DataView as a new source to the combobox
/* The 3 lines below is the tricky part. If you repopulate a combobox, the first
item in it will be automatically selected so let's unselect it*/
cmb_box.SelectedIndex = -1; // unselection
/* Again when a combobox repopulated the text region will be reset but we have the
srch variable to rewrite what's written before */
cmb_box.Text = srch;
/* And since we're rewriting the text region let's make the cursor appear at the
end of the text - assuming 100 chars is enough*/
cmb_box.Select(100,0);
cmb_box.DroppedDown = true; // Showing the dropdownlist
}
}