【问题标题】:Winforms ComboBox: event when caret moves?Winforms ComboBox:插入符号移动时的事件?
【发布时间】:2012-03-17 09:17:31
【问题描述】:
我正在使用 WinForms ComboBox 构建一种自动完成文本输入,我需要根据字符串中插入符号的位置来更改自动完成行为。
但是,ComboBox 似乎没有公开事件来捕捉插入符号位置的变化。当用户打字时,我可以捕捉到TextUpdated。但是当用户导航时,我需要处理KeyDown 并检查KeyCode 是Left、Right、Home 还是End。但是,在更改插入符号之前触发了该事件,因此我需要计算新的插入符号位置。这非常烦人,因为这需要在按下 Ctrl 时进行特殊处理,并且可能还有一些我不知道的特殊可访问性设置。
所以我想知道是否有更好的方法来做到这一点。每次插入符号在ComboBox 中更改位置时是否会触发一个事件,或者是否有办法在KeyDown 事件由ComboBox 处理后执行代码?
【问题讨论】:
标签:
c#
winforms
events
combobox
【解决方案1】:
@ogggre 答案只是解决方案的一半。插入符号也可以被鼠标移动,因此鼠标事件需要相同的事件处理程序,并且以编程方式,在大多数情况下不能被事件跟踪,除了更改文本属性,所以要尽可能地跟踪插入符号的位置需要这些事件:
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_MouseDown(object sender, MouseEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_MouseMove(object sender, MouseEventArgs e)
{
if((Control.MouseButtons | MouseButtons.Left) != 0)
CheckCaretPosition();
}
private void comboBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_TextChanged(object sender, EventArgs e)
{
CheckCaretPosition();
}
void CheckCaretPosition()
{
int caretPosition = comboBox1.SelectionStart;
Debug.WriteLine(caretPosition);
}
... 或者,或者,如果您真的需要在任何情况下跟踪 ComboBox 中的插入符号,您可以使用每 50-100 毫秒触发一次的计时器并检查插入符号位置是否更改。不过,这将是一个非常糟糕的解决方案。
【解决方案2】:
您可以在 KeyDown 处理后立即执行代码:
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
BeginInvoke(new MethodInvoker(_CheckCaretPosition));
}
void _CheckCaretPosition()
{
int caretPosition = comboBox1.SelectionStart;
Debug.WriteLine(caretPosition);
}