我有一个带有下拉组合框的 winform。此组合框包含所有员工姓名并充当地址簿:

到目前为止,一切都很好。唯一的问题是我们的活动目录有一些混淆的姓/名,我不知道每个人的姓。然而,组合框的自动建议总是从字符串的开头开始,所以我只能按姓氏搜索。
出于这个原因,我尝试实现类似模糊搜索的东西。
但是随着我的搜索的实施,我得到了一个非常奇怪的行为,但首先是我的实施,所以你知道我在说什么。
Form1.cs
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
namespace TicketCreator
{
public partial class TicketCreator_UI : Form
{
DataTable AllNames = new DataTable();
List<(string name, string mail)> DomainSearchResult = new List<(string name, string mail)>();
List<string> GeneratedNames = new List<string>();
public TicketCreator_UI()
{
InitializeComponent();
FillDropDown();
}
private void User_dropdown_KeyPress(object sender, KeyPressEventArgs e)
{
//string text = user_dropdown.Text;
string name = $"{user_dropdown.Text}{e.KeyChar.ToString()}";//join previous text and new pressed char
DataRow[] rows = AllNames.Select($"UserName LIKE '%{name}%'");
DataTable filteredTable = AllNames.Clone();
foreach (DataRow r in rows)
filteredTable.ImportRow(r);
user_dropdown.DataSource = null;
user_dropdown.DataSource = filteredTable.DefaultView;
user_dropdown.DisplayMember = "UserName";
user_dropdown.SelectedIndex = -1;
//user_dropdown.Text = text;
}
private void FillDropDown()
{
// fill users combobox
DomainSearchResult = ADTools.ListUsers();
foreach ((string name, string mail) user in DomainSearchResult)
{
GeneratedNames.Add($"{user.name} <{user.mail}>");
}
AllNames.Columns.Add("UserName");
foreach (string row in GeneratedNames)
AllNames.Rows.Add(row);
user_dropdown.DataSource = GeneratedNames;
user_dropdown.Text = "";
}
}
}
首先,FillDropDown()调用它会将用户从 AD 中拉出并将他们推送到组合框中一次。
之后,当按键按下时,执行模糊搜索并更新 ComboBox。
看一下屏幕截图:显示了
我输入的最后一个字母,但只要我输入一个新字母,它就会被最新的输入取代。在这个例子中,到目前为止我输入了“Julian”。

我试图通过首先获取 ComboBox 的文本,然后更新数据源并最后重新插入文本来伪造这种行为:
private void User_dropdown_KeyPress(object sender, KeyPressEventArgs e)
{
string text = user_dropdown.Text; // Updated
string name = $"{user_dropdown.Text}{e.KeyChar.ToString()}";//join previous text and new pressed char
DataRow[] rows = AllNames.Select($"UserName LIKE '%{name}%'");
DataTable filteredTable = AllNames.Clone();
foreach (DataRow r in rows)
filteredTable.ImportRow(r);
user_dropdown.DataSource = null;
user_dropdown.DataSource = filteredTable.DefaultView;
user_dropdown.DisplayMember = "UserName";
user_dropdown.SelectedIndex = -1;
user_dropdown.Text = text; // Updated
}
文本现在保留在 ComboBox 中,但被镜像。当我输入“Julian Bechtold”时,会显示以下示例:

我怀疑当数据源更改但 UI 不会立即更新时,文本标记会跳转到 ComboBox 的开头。输入字母后,您可以看到字母 1 后面的标记:

是否可以更改/解决此行为?
此致,
朱利安·贝希托德

