2

我有一个带有下拉组合框的 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 后面的标记:
在此处输入图像描述

是否可以更改/解决此行为?

此致,

朱利安·贝希托德

编辑:
方向设置为从左到右
在此处输入图像描述

4

0 回答 0