我正在尝试在C#中实现我自己的ComboBox类,因为,直到3.5 .NET Framework(如果我没有误解)建议查找是使用" StartWith"功能(即,如果列表包含" Doe,John"以及用户类型" John",则不显示该项目)。基本上我是在文本更改事件中添加或删除项目,从列表的初始内容中获取它们。一切都适合我正在寻找的东西,唯一的问题是,当单击ComboBox时,即使它不等于插入的文本,仍然会选择一个项目。按照我做的例子,我想要那个" Doe,John"只有当用户点击它时,才会选择(并设置为ComboBox.Text属性),如果用户只输入" John"并且没有项严格等于它(不仅仅包含它),然后Text属性必须保留为用户插入它。这是我派生类的代码
public class customTB : ComboBox
{
private object[] startlist;
public customTB() : base()
{
this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.None;
this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.None;
this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown;
this.Sorted = true;
this.KeyPress += customTB_KeyPress;
this.TextChanged += customTB_TextChanged;
this.Enter += customTB_Enter;
}
void customTB_Enter(object sender, EventArgs e)
{
this.DroppedDown = (this.Items.Count > 0);
}
void customTB_TextChanged(object sender, EventArgs e)
{
UpdateList();
}
void customTB_KeyPress(object sender, KeyPressEventArgs e)
{
this.DroppedDown = (this.Items.Count>0);
}
void UpdateList()
{
if (this.startlist == null)
{
//get starting lists elems
this.startlist = new Object[this.Items.Count];
this.Items.CopyTo(this.startlist, 0);
}
this.BeginUpdate();
foreach (object o in startlist)
{
if (o.ToString().Contains(this.Text))
{
if (!this.Items.Contains(o))
this.Items.Add(o);
}
else if (this.Items.Contains(o))
this.Items.Remove(o);
}
this.EndUpdate();
}
}
如果尝试过,只要您尝试退出ComboBox,就会突出显示文本并将其值设置为项目。 作为我想要的例子是: 项目包含" Doe John"," Smith John"," Smith Marie"。 如果用户键入" John",则下拉项目为" Doe John"和史密斯约翰"但如果他没有点击任何下拉元素并退出ComboBox(即点击外面),那么文本仍然是" John"
答案 0 :(得分:0)
有一个布尔变量itemClicked