Как создать поле автозаполнения или текстовое поле для фильтрации текста, содержащего строку - PullRequest
5 голосов
/ 30 ноября 2010

Как создать автозаполняемый ComboBox или TextBox, который фильтрует текст на основе строки?

Например: если я наберу «a» в TextBox, я смогу увидеть только все строки, содержащие «a».

Ответы [ 6 ]

8 голосов
/ 30 ноября 2010

Если вы имеете в виду показывать предложения, тогда просто изменить свойство, если в выбранной вами IDE выбран TextBox:

Параметры, показанные на рисунке, позволяют изменить правила автозаполнения текста в текстовом поле, а также источник предложений. (Visual Studio 2010)

Properties

Вы можете перейти по следующей ссылке, чтобы узнать больше об элементе управления TextBox.

Управление текстовыми полями MSDN

3 голосов
/ 15 декабря 2010

Реализация автозаполнения в Windows Forms использует объект автозаполнения Shell, который может выполнять сопоставление «BeginWith» только до Windows Vista.Если вы можете требовать от своих пользователей обновления до Windows Vista, вы можете использовать IAutoComplete2 :: SetOptions , чтобы указать ACO_NOPREFIXFILTERING.В противном случае, боюсь, вам нужно написать свой .

1 голос
/ 03 декабря 2010

Вот как я автоматически заполняю определенное значение в поле comboDropDown.

    void comboBox_Leave(object sender, EventArgs e)
    {
       ComboBox cbo = (sender as ComboBox);
        if (cbo.Text.Length > 0)
        {
            Int32 rowIndex = cbo.FindString(cbo.Text.Trim());
            if (rowIndex != -1)
            {
                cbo.SelectedIndex = rowIndex;
            }
            else
            {
                cbo.SelectedIndex = -1;
            }
        }
        else
        {
            cbo.SelectedIndex = -1;
        }

    }
0 голосов
/ 25 марта 2014

Я знаю, что это старая тема, но я так старался найти решение для фильтрации автозаполнения в 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
   }
}
0 голосов
/ 30 ноября 2010

Я думаю, что вам лучше всего переопределить событие OnKeyDown (KeyEventArgs e) и использовать это значение для фильтрации ComboBox.AutoCompleteCustomSource. Затем, как отмечено выше, измените AutoCompleteSource на AutoCompleteSource.ListItems.

0 голосов
/ 30 ноября 2010

Этот фильтр фильтрует результаты на основе пользовательского ввода.Оптимизация для больших списков, заполнение ваших собственных данных и обработка ошибок, оставленных для вас:

public partial class Form1 : Form
    {

        List<String> data;
        ListView lst = new ListView();
        TextBox txt = new TextBox();

        public Form1()
        {
            InitializeComponent();
            data = new List<string>("Lorem ipsum dolor sit amet consectetur adipiscing elit Suspendisse vel".Split());
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Controls.Add(txt);
            lst.Top = 20;
            txt.TextChanged += new EventHandler(txt_TextChanged);
            lst.View = View.List;
            this.Controls.Add(lst);
            list_items("");
        }

        void txt_TextChanged(object sender, EventArgs e)
        {
            list_items(txt.Text);
        }

        void list_items(string filter)
        {
            lst.Items.Clear();
            List<string> results = (from d in data where d.Contains(filter) select d).ToList();
            foreach (string s in results)
            {
                lst.Items.Add(s);
            }
        }
    }

Для автоматического заполнения комбинированного списка установите свойства AutoCompleteSource и AutoCompleteMode:

cbo.AutoCompleteSource = AutoCompleteSource.ListItems;
cbo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

Источник ListItems указывает комбо использовать его коллекцию элементов в качестве источника автозаполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...