Winforms Combobox элементы фильтрации по текстуC#

Место общения программистов C#
Anonymous
Winforms Combobox элементы фильтрации по тексту

Сообщение Anonymous »

Я пытаюсь использовать Combobox в той же духе, где пользователю нуждаются в минимальных усилиях, чтобы выбрать значение или заполнить какой -то пользовательский текст. Needed behavior is:
  • Open combobox dropdown if user interact ComboBox (tab, click, type something)
  • Filter items by text in ComboBox (just after focus show all items)
  • Allow user to enter some custom text (not listed in items in ComboBox)
У меня есть реализация, которая работает таким образом, но иногда, когда он вводится пользовательским текстом, не соответствующий ни одного элемента, а затем пользователь фокусирует и оставляя Combobox по вкладке или щелкнув снаружи, когда выпадается, исключение произошло в combobox.objectcollection.cs: 227 или combobox.objectcollection.cs: 230. < /p>
Code of My Somtry. Spearced Spearce: Br /p> prese of My Somtry Shod: Br /p> p> p> p> p> p> p> pre -pret a. class = "lang-cs prettyprint-override">using System.Data;

namespace SearchComboBox
{
public class MainForm : Form
{
private ComboBox itemsComboBox;
private BindingSource itemsBindingSource;
private DataTable itemsTable;
private TextBox initialFocusTextBox;

private static string[] items = {
"First item",
"Second item",
"Third item",
"Item 4",
"Item 5",
};

public MainForm()
{
SuspendLayout();
ClientSize = new Size(300, 150);

initialFocusTextBox = new TextBox() {
Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left,
Location = new Point(12, 12),
Size = new Size(276, 23),
TabIndex = 0,
};
Controls.Add(initialFocusTextBox);

itemsComboBox = new ComboBox() {
Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left,
Location = new Point(12, 41),
Size = new Size(276, 23),
TabIndex = 1,
};
Controls.Add(itemsComboBox);

itemsTable = new DataTable();
itemsTable.Columns.Add("Item", typeof(string));
itemsTable.Columns.Add("Search", typeof(string));
foreach (string item in items) {
itemsTable.Rows.Add(item, item.ToLower());
}

itemsBindingSource = new BindingSource();
itemsBindingSource.DataSource = itemsTable;

itemsComboBox.DisplayMember = "Item";
itemsComboBox.DataSource = itemsBindingSource;
itemsComboBox.Click += itemsComboBox_Click;
itemsComboBox.Enter += itemsComboBox_Enter;
itemsComboBox.TextUpdate += itemsComboBox_TextUpdate;

itemsComboBox.SelectedIndex = -1;
itemsComboBox.Text = string.Empty;

ResumeLayout(false);
PerformLayout();
}

private void itemsComboBox_Click(object? sender, EventArgs e)
{
itemsComboBox.DroppedDown = true;
}

private void itemsComboBox_Enter(object? sender, EventArgs e)
{
var selectText = itemsComboBox.Text;

itemsBindingSource.Filter = null;

itemsComboBox.SelectedIndex = -1;
itemsComboBox.Text = selectText;
itemsComboBox.SelectAll();

itemsComboBox.DroppedDown = true;
}

private void itemsComboBox_TextUpdate(object? sender, EventArgs e)
{
var selectText = itemsComboBox.Text;
var selectionStart = itemsComboBox.SelectionStart;
var selectionLength = itemsComboBox.SelectionLength;

if (string.IsNullOrWhiteSpace(selectText))
{
itemsBindingSource.Filter = null;
}
else
{
itemsBindingSource.Filter = string.Format("Search LIKE '*{0}*'", selectText);
}

itemsComboBox.Text = selectText;
itemsComboBox.SelectionStart = selectionStart;
itemsComboBox.SelectionLength = selectionLength;

itemsComboBox.DroppedDown = true;
}
}
}
< /code>
Мой реальный вариант использования более сложный, потому что у меня есть список объектов, и я хочу получить выбранный элемент, который является объектом или текстом, если введен пользовательский текст. Но ошибка произошла событие в этой упрощенной версии.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ng-by-text

Вернуться в «C#»