C # Combobox изменить выбранный элемент при наборе текста - PullRequest
0 голосов
/ 28 июня 2011

У меня есть комбобокс.У cmbx было несколько сотен предметов.Пользователь должен иметь возможность вводить текст в cmbx.Пока пользователь печатает текст, должен быть выбран элемент, который начинается с введенного значения.Пользователь должен иметь возможность продолжать печатать.

Я попробовал код ниже:

private void cmbGageCode_TextChanged(object sender, EventArgs e)
            {
                int itemsIndex = 0;
                foreach (string item in cmbGageCode.Items)
                {
                    if (item.Contains(cmbGageCode.Text))
                    {
                        cmbGageCode.SelectedIndex = itemsIndex;
                    }
                    itemsIndex++;
                }
            }

Это приводит к следующему: Когда пользователь вводит в cmbx элемент, который содержит значениевыбран, и курсор находится в начале текста.Это означает, что когда вставляются 2 символа, выбирается какой-либо элемент, и я не могу ввести полное значение.

У кого-нибудь есть идеи, как заставить это работать?Может быть, мне нужно использовать другой элемент управления?Или, может быть, я поступаю об этом совершенно неправильно?Пожалуйста, помогите!

Ответы [ 4 ]

4 голосов
/ 22 января 2012

С AutoCompleteMode установлено на SuggestAppend и AutoCompleteSource установлено на ListItems

http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.autocompletesource.aspx

3 голосов
/ 28 июня 2011

Попробуйте этот код.

private void cmbGageCode_TextChanged(object sender, EventArgs e)
        {
            int itemsIndex = 0;
            foreach (string item in cmbGageCode.Items)
            {
                if (item.IndexOf(cmbGageCode.Text) == 0)
                {
                    cmbGageCode.SelectedIndex = itemsIndex;
                    cmbGageCode.Select(cmbGageCode.Text.Length - 1, 0);
                    break;
                }
                itemsIndex++;
            }
        }

Дайте мне знать, если это то, что вы хотите.

1 голос
/ 28 июня 2011

Есть встроенная поддержка auto-complete, вы можете сделать

 ComboBox cmbBox = new ComboBox();
            cmbBox.Items.AddRange(new string[] { "aaa", "bbbb", "dddd"});
            AutoCompleteStringCollection autoCompleteSource= new AutoCompleteStringCollection();
            cmbBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
            foreach (string tempStr in cmbBox.Items)
                autoCompleteSource.Add(tempStr);
            cmbBox.AutoCompleteCustomSource = autoCompleteSource;
            cmbBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;


            this.Controls.Add(cmbBox);//adding combobox to form control collection
0 голосов
/ 18 июля 2018

Во-первых, в ответ на Cody Grey, причина, по которой я нуждался в этом, заключалась в том, что мой диалог используется в приложении, которое не является STA, и я не могу сделать его STA. Автозаполнение, похоже, требует STA. Итак, мне нужно было сделать это самому. Я сделал несколько улучшений в ответе Скинткингла, и он прекрасно работает.

private void CB_TextChanged(object sender, EventArgs e)
{
  try
  {
    CB.TextChanged -= CB_TextChanged;   // Don't respond to text changes from within this function
    int start = CB.SelectionStart;      // Where did user enter new text?
    int length = CB.SelectionLength;    // How much text did they enter?
    if (start > 0) length += start;     // Always consider text from beginning of string
    string text = CB.Text.Substring(0, length); // Look at start of text
    foreach (string item in CB.Items)
    {
      if (item.StartsWith(text, StringComparison.OrdinalIgnoreCase))
      {
        // If the typed text matches one of the items in the list, use that item
        // Highlight the text BEYOND where the user typed, to the end of the string
        // That way, they can keep on typing, replacing text that they have not gotten to yet
        CB.Text = item;
        CB.SelectionStart = length;
        CB.SelectionLength = item.Length - length;
        break;
      }
    }
  }
  finally
  {
    CB.TextChanged += CB_TextChanged;  // Restore ability to respond to text changes
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...