C# 在输入文本时在组合框中列出匹配项?

C# 在输入文本时在组合框中列出匹配项?,c#,.net,winforms,combobox,mvp,C#,.net,Winforms,Combobox,Mvp,我在表单中有一个组合框,当用户在框中键入一些文本时,如果数据库中有与键入文本匹配的项,则应在组合框中列出。因此,如果要输入的项目已在数据库中,则可以通知用户。我正试图实现以下目标 当在组合框中输入文本时将触发一个事件。收听该事件时,Presenter将从数据库中获取匹配的用户列表,然后该列表将被设置为组合框的DataSource,如下所示 但是为什么它不显示在组合中呢?请让我知道这个代码中的问题 形式 数据服务 public IEnumerable<User> GetUser

我在表单中有一个
组合框
,当用户在框中键入一些文本时,如果数据库中有与键入文本匹配的项,则应在
组合框
中列出。因此,如果要输入的项目已在数据库中,则可以通知用户。我正试图实现以下目标

当在
组合框中输入文本时
将触发一个事件。收听该事件时,
Presenter
将从数据库中获取匹配的用户列表,然后该列表将被设置为
组合框的
DataSource
,如下所示

但是为什么它不显示在组合中呢?请让我知道这个代码中的问题

形式

数据服务

    public IEnumerable<User> GetUsers(string userID)
    { 
        string selectStatement = "SELECT user_id from [user] WHERE user_id like '@userID %'";
        List<User> UserList = new List<User>();

        using (var sqlConnection = new SqlConnection(db.ConnectionString))

        using (var sqlCommand = new SqlCommand(selectStatement, sqlConnection))
        {
            sqlCommand.Parameters.Add("@userID", SqlDbType.VarChar).Value = userID ;
            sqlConnection.Open();

            using (SqlDataReader dataReader = sqlCommand.ExecuteReader())

                while (dataReader.Read())
                {
                    UserList.Add(
                    new User 
                    {
                        UserID = (string) dataReader["user_id"]
                    });
                }

            return UserList;

        }
    }
public IEnumerable GetUsers(字符串用户ID)
{ 
string selectStatement=“从[user]中选择用户标识,其中用户标识类似于“@userID%””;
List UserList=新列表();
使用(var sqlConnection=newsqlconnection(db.ConnectionString))
使用(var sqlCommand=newsqlcommand(selectStatement,sqlConnection))
{
添加(“@userID”,SqlDbType.VarChar).Value=userID;
sqlConnection.Open();
使用(SqlDataReader=sqlCommand.ExecuteReader())
while(dataReader.Read())
{
UserList.Add(
新用户
{
用户id=(字符串)数据读取器[“用户id”]
});
}
返回用户列表;
}
}

我不能确切地告诉您如何更改代码,因为我缺少很多细节,例如一些事件和类以及类和对象的可能嵌套状态

但是,正如我所指出的,错误在于,
GetUsers
返回的结果
IEnumerable
被丢弃了

您曾写道,它应该通过
属性用户列表
被用作
组合框
数据源
,但实际上您通过声明一个新的

List<User> UserList = new List<User>();
组合框中显示了一个虚拟值

你不应该使用我的代码,但要和你一起设置!改变

_DataService.GetUsers(_View.UserName );


似乎是直接的解决方案,但您可能需要注意连接内部和外部类变量的方法。

我应该将参数的值指定为
userID+“%”,而不是
userID
。关于用户列表,我想我必须有一个循环,将项目添加到列表的某个地方

使用visual studio,按如下方式设置combobox属性
combobox autocompletemode=SuggestAppend&autocompletesource=ListItems

我在WPF中使用get/set和INPC完成了这项工作。我发现即使是20000个项目,都值得提前下载并使用LINQ。获取第一个匹配的标签也是一个不错的特性。如果您想进入一些更高级、响应更快的UI,那么我建议使用WPF和MVVM。该列表将设置为ComboBox的数据源:我看不到该部分发生在哪里。看起来返回的结果集已被丢弃。。但是也许我在你的代码中遗漏了一些东西..???@TaW,实际上我是在view->public IEnumerable UserList{set{cmbUserName.DataSource=value;}中引用这个属性的,谢谢你的建议。我在我的sql中发现了一个问题。当硬编码时,其工作,但当使用参数时,其不工作。在我的代码中,@userID和%之间有一个空格。即使它被删除了,也无法提供所需的输出?您需要使用一个参数:
MySqlCommand cmd=oldDb.GetSqlStringCommand(CommandType.Text,“从用户名为@searchText的用户中选择*);MySqlParameter name参数=cmd.CreateParameter();nameparmeter.DbType=DbType.String;nameParameter.ParameterName=“@searchText”nameParameter.Value=“%John%”摘自或查看“谢谢”,现在就可以了。我应该将参数的值指定为
userID+“%”
,而不是
userID
。现在我在列表中遇到了一个问题。用户列表未显示在列表中。我想我必须有一个循环,将项目添加到列表的某个地方。
List<User> UserList = new List<User>();
private void cmbUserName_TextChanged(object sender, EventArgs e)
{
  UserList = _DataService.GetUsers("_View.UserName");

   ///OnChangeText(sender, e); re-instate your own wiring!
}
_DataService.GetUsers(_View.UserName );
Userlist = _DataService.GetUsers(_View.UserName );