我正在尝试在 C# 中实现我自己的 ComboBox 类,因为直到 3.5 NET Framework(如果我没有记错的话),建议使用“StartWith”函数进行查找(即,如果列表包含“Doe,John”和用户类型“ John”,该项目不显示)。基本上,我在文本更改事件中添加或删除项目,从列表的初始内容中获取它们。对于我正在寻找的内容来说,一切都工作得很好,唯一的问题是,当单击 ComboBox 时,即使项目不等于插入的文本,仍然会选择一个项目。按照我所做的示例,我希望仅当用户单击“Doe,John”时才选择“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();
}
}
如果尝试过,每当您尝试退出组合框时,文本都会突出显示,并且其值将设置为一个项目。
我想要的例子是:
项目包含“Doe John”、“Smith John”、“Smith Marie”。
如果用户输入“John”,则下拉项为“Doe John”和“Smith John”,但如果他没有单击任何下拉元素并退出组合框(即单击外部),则文本仍为“John”
有一个布尔变量 itemClicked
- 在 Enter 事件处理程序中将 itemClicked 设置为 false
- 在 SelectionChangeCommited 事件处理程序中将 itemClicked 设置为 true
- 如果 DropDownClosed 事件处理程序中没有 itemClicked,则将 Text 属性设置为 string.Empty
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)