我在表单中有一个ComboBox
,当用户在框中键入一些文本时,如果数据库中存在匹配的文本类型的匹配项,则应列在ComboBox
中。这样,如果输入的项目已经在数据库中,则可以通知用户。我正在尝试如下实现这一点。
在combo
中输入文字时,它会触发一个事件。收听该事件后,Presenter
将从数据库中获取匹配的用户列表,然后列表将设置为DataSource
的{{1}},如下所示...
但是为什么它没有显示在组合中?请让我知道此代码中的问题!
表格
ComboBox
演示
public partial class frmUser : Form
{
// two seperate get and set properties are used to same combo box as a list will be set as the datasource.
public string UserName
{
get{return cmbUserName.Text;}
}
public IEnumerable<User> UserList
{
set { cmbUserName.DataSource = value; }
}
private void cmbUserName_TextChanged(object sender, EventArgs e)
{
OnChangeText(sender, e);
}
}
的DataService
class UserPresenter
{
private void WireUpEvents()
{
_View.OnChangeText += new EventHandler(_View_OnChangeText);
}
private void _View_OnChangeText(object sender, EventArgs e)
{
ShowMatchingUsers();
}
private void ShowMatchingUsers()
{
var userList = _DataService.GetUsers(_View.UserName ); //edit
_Veiew.UserList = userList; //edit
}
}
答案 0 :(得分:1)
我无法告诉您完全如何更改代码,因为我缺少一些细节,例如一些事件和类以及类和对象的可能嵌套状态。
但是,正如我所指出的那样,错误是IEnumerable<User>
带来的GetUsers
被遗弃的事实。
您写道应该通过DataSource
用作ComboBox
的{{1}},但实际上您隐藏这个属性通过声明一个新的
Property UserList
本地List<User> UserList = new List<User>();
。这样可以,虽然有点令人困惑; (我建议你称它为GetUsers
;)之类的东西,但是你仍然需要将真实的newUserlist
设置为返回的结果集!
当我这样补丁时(缺少关于你实际代码的重要信息)
UserList
Combobox中的虚拟值显示正常。
您不应该使用我的代码,而是与您一起设置!改变
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 );
似乎是直接解决方案,但您可能需要注意一种连接内部和外部类变量的方法。
答案 1 :(得分:1)
使用visual studio,如下设置combobox属性 combobox autocompletemode = SuggestAppend &amp; autocompletesource = <强> listItems中强>
答案 2 :(得分:0)
我应该将参数的值设为userID+"%"
而不是userID
。关于用户列表,我想我必须有一个循环添加项目到列表的某个地方。