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>
.csproj выглядит так: < /p>


WinExe
net7.0-windows
enable
true
enable


< /code>
Мой реальный вариант использования более сложный, потому что у меня есть список объектов, и я хочу получить выбранный элемент, который является объектом или текстом, если введен пользовательский текст. Но событие ошибки произошла в этой упрощенной версии.
Я пытался обновить версию Winforms до 9, но проблема остается. Только когда ESC нажимается или за пределами ComboBox нажимается.> [Exception] System.Windows.Forms.dll!System.Windows.Forms.ComboBox.ObjectCollection.this[int].get(int index) Line 230 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.ComboBox.Text.get() Line 1250 C#
[Exception] SearchComboBox.dll!SearchComboBox.MainForm.itemsComboBox_Enter(object sender, System.EventArgs e) Line 71 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.UpdateFocusedControl() Line 1644 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.AssignActiveControlInternal(System.Windows.Forms.Control value) Line 558 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ActivateControl(System.Windows.Forms.Control control, bool originator) Line 423 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.ComboBox.ChildWndProc(ref System.Windows.Forms.Message m) Line 1713 C#
[Exception] System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(nint hWnd, Interop.User32.WM msg, nint wparam, nint lparam) Line 369 C#
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(nint hWnd, Interop.User32.WM msg, nint wparam, nint lparam) Line 380 C#
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DefWndProc(ref System.Windows.Forms.Message m) Line 515 C#
System.Windows.Forms.dll!System.Windows.Forms.ComboBox.ChildWndProc(ref System.Windows.Forms.Message m) Line 1810 C#
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(nint hWnd, Interop.User32.WM msg, nint wparam, nint lparam) Line 369 C#
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.Interop.Mso.IMsoComponentManager.FPushMessageLoop(nuint dwComponentID, Interop.Mso.msoloop uReason, void* pvLoopData) Line 345 C#
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Interop.Mso.msoloop reason, System.Windows.Forms.ApplicationContext context) Line 1117 C#
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Interop.Mso.msoloop reason, System.Windows.Forms.ApplicationContext context) Line 981 C#
SearchComboBox.dll!SearchComboBox.Program.Main() Line 14 C#



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

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