vs2008 / vs2010在TextBox中有一个插入符号位置更改事件吗?

时间:2010-12-19 18:56:33

标签: c# winforms visual-studio

我需要密切注意TextBox中的插入位置;这有什么事吗?我不想使用计时器(例如,如果位置改变,每隔10ms检查一次)。

我正在使用Windows窗体。

4 个答案:

答案 0 :(得分:2)

本机Windows控件不会为此生成通知。试图解决这个限制是痛苦的一个方法,你只是无法分辨插入符号的位置。 SelectionStart属性是不是一个可靠的指标,插入符号可以出现在选择的任一端,具体取决于用户选择文本的方向。当控件具有焦点时,Pinvoking GetCaretPos()给出插入位置,但由于TextRenderer.MeasureText()中的不准确,将其映射回字符索引并不容易。

不要去那里。相反,解释为什么你认为你需要这个。

答案 1 :(得分:2)

希望这会有所帮助。我在Mouse Move

上做了这个
private void txtTest_MouseMove(object sender, MouseEventArgs e)
{
   string str = "Character{0} is at Position{1}";
   Point pt = txtTest.PointToClient(Control.MousePosition);
   MessageBox.Show(
      string.Format(str
      , txtTest.GetCharFromPosition(pt).ToString()
      , txtTest.GetCharIndexFromPosition(pt).ToString())
   );
}

答案 2 :(得分:0)

大多数文字控件都会有KeyDownKeyUp个事件,您可以使用这些事件找出按下了哪个键。

我已链接到winforms TextBox,因为您没有指定使用的是哪种技术。

然而,没有直接的方法来判断光标在字段中的位置。

答案 3 :(得分:0)

我不确定SelectionChanged事件是否在更改了插入符号位置时触发了evon,但您应该尝试一下。

如果不是,您可以创建计时器并检查SelectionStart属性值是否更改。

更新:创建一个引发SelectionChanged事件的TextBox类非常简单:

public class TextBoxEx : TextBox
{

    #region SelectionChanged Event

    public event EventHandler SelectionChanged;

    private int lastSelectionStart;
    private int lastSelectionLength;
    private string lastSelectedText;
    private void RaiseSelectionChanged()
    {
        if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText)
            OnSelectionChanged();

        lastSelectionStart = this.SelectionStart;
        lastSelectionLength = this.SelectionLength;
        lastSelectedText = this.SelectedText;
    }

    protected virtual void OnSelectionChanged()
    {
        var eh = SelectionChanged;
        if (eh != null)
        {
            eh(this, EventArgs.Empty);
        }
    }

    #endregion

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        RaiseSelectionChanged();
    }

}