c# Combobox用户控件没有正常工作
本文关键字:常工作 工作 Combobox 用户 控件 | 更新日期: 2023-09-27 18:19:18
我正在修复一个使用名为CompleteComboBox
的用户控件的c#
项目。
它起部分作用。
-
用户第一次在
textbox
部分输入字符串时,列表按正常打开,并位于右行。第二次-列表没有打开,但它确实显示了textbox
部分中匹配的行。然后,如果我打开列表并开始写入其中一个项目的开头,但随后单击其中一个项目并按enter键-该项目未被选中,而是在text box
部分输入字母时被选中的项目。
希望你能理解我。
代码如下:
namespace BestInvest.UserControls
{
public partial class CompleteComboBox : System.Windows.Forms.ComboBox
{
public event System.ComponentModel.CancelEventHandler NotInList;
private bool _limitToList = true;
private bool _inEditMode = false;
bool start;
public CompleteComboBox()
: base()
{
start = true;
this.Text = ClsConsts.InitializeTextForCombo;
}
[Category("Behavior")]
public bool LimitToList
{
get { return _limitToList; }
set { _limitToList = value; }
}
protected virtual void OnNotInList(System.ComponentModel.CancelEventArgs e)
{
if (NotInList != null)
{
NotInList(this, e);
}
}
protected override void OnTextChanged(System.EventArgs e)
{
if (_inEditMode)
{
string input = Text;
int index = FindString(input);
if (index >= 0)
{
_inEditMode = false;
SelectedIndex = index;
_inEditMode = true;
Select(input.Length, Text.Length);
//base.DroppedDown = true;
}
}
base.OnTextChanged(e);
}
protected override void OnValidating(System.ComponentModel.CancelEventArgs e)
{
if (this.LimitToList)
{
int pos = this.FindStringExact(this.Text);
if (pos == -1)
{
OnNotInList(e);
}
else
{
this.SelectedIndex = pos;
}
}
base.OnValidating(e);
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
if (start)
{
base.DroppedDown = true;
//else
start = false;
}
if (e.KeyCode == Keys.Enter)
{
base.DroppedDown = false;
start = true;
}
_inEditMode = true;
base.OnKeyDown(e);
}
}
}
你的代码很乱。看start
标志。它并不是在你期望的所有情况下都设为true。这就是为什么第一次和第二次的行为不同。
您的OnKeyDown
事件不会在您期望的所有键上触发。这就是退格键不起作用的原因。这里有一些关于检测退格的帖子:例如这个