C# 组合框用户控件无法正常运行
C# Combobox user control does not funtion as it should
我正在修复一个使用名为 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
事件不会在您期望的所有键上触发。这就是退格键不起作用的原因。有几篇关于检测退格键的帖子:See for example this one
我正在修复一个使用名为 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
事件不会在您期望的所有键上触发。这就是退格键不起作用的原因。有几篇关于检测退格键的帖子:See for example this one