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