【问题标题】:Winforms ComboBox: event when caret moves?Winforms ComboBox:插入符号移动时的事件?
【发布时间】:2012-03-17 09:17:31
【问题描述】:

我正在使用 WinForms ComboBox 构建一种自动完成文本输入,我需要根据字符串中插入符号的位置来更改自动完成行为。

但是,ComboBox 似乎没有公开事件来捕捉插入符号位置的变化。当用户打字时,我可以捕捉到TextUpdated。但是当用户导航时,我需要处理KeyDown 并检查KeyCodeLeftRightHome 还是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);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 2019-05-28
        相关资源
        最近更新 更多