C# 组合框释放文本并显示它

C# 组合框释放文本并显示它,c#,winforms,combobox,C#,Winforms,Combobox,我有一个带下拉组合框的winform。此组合框包含所有员工姓名并充当通讯簿: 到目前为止还不错。唯一的问题是我们的active directory有一些混合的姓/名,我不知道每个人的姓。但是,组合框的自动建议始终以字符串开头,因此我只能按姓氏搜索 出于这个原因,我尝试实现模糊搜索之类的功能 搜索本身运行良好: 但是随着我搜索的实现,我得到了一个非常奇怪的行为,但首先是我的实现,所以你知道我在说什么 Form1.cs using System.Collections.Generic; usin

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

到目前为止还不错。唯一的问题是我们的active directory有一些混合的姓/名,我不知道每个人的姓。但是,组合框的自动建议始终以字符串开头,因此我只能按姓氏搜索

出于这个原因,我尝试实现模糊搜索之类的功能

搜索本身运行良好:

但是随着我搜索的实现,我得到了一个非常奇怪的行为,但首先是我的实现,所以你知道我在说什么

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 = "";
        }
    }
}
文本现在保留在组合框中,但被镜像。当我键入“Julian Bechtold”时,将显示以下示例:

我的怀疑是,当数据源更改但UI没有立即更新时,文本标记会跳到组合框的开头。您可以在键入字母后看到字母1后面的标记:

是否有可能改变/改变这种行为

致以最良好的祝愿

朱利安·贝奇托德

编辑:
方向设置为从左到右

方向设置为从左到右:方向实际上是从左到右设置的,然后尝试:
user\u dropdown.SelectionStart=user\u dropdown.Text.Length
在更新
Text
属性后将光标设置到末尾。只需:
如果(user\u dropdown.Text.Length==0)返回;(user_dropdown.DataSource作为DataTable).DefaultView.RowFilter=$“{user_dropdown.DisplayMember}类似“{user_dropdown.Text}%””。您可以删除所有其余的。由于您没有自动完成功能,因此可以设置
.DroppedDown=true
,以在过滤时显示下拉列表。您还可以将自动完成功能与您自己的过滤功能混合使用(不过这是一个较长的故事)。
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
}