【问题标题】:Create event for WinForm usercontrol property changed为 WinForm 用户控件属性创建事件已更改
【发布时间】:2013-02-12 10:28:43
【问题描述】:

我想在 TextBox 控件的 SelectedText 或 SelectionStart 属性发生更改时引发事件。有没有什么不涉及从头开始编写自定义 TextBox 控件的简单方法?

显然,一种选择是让计时器检查这些属性的更改,但我不希望使用任何计时器。

到目前为止,我已经尝试创建一个从 TextBox 继承并覆盖 SelectedText 属性的控件,但是失败了。另外,SelectionStart 不能被覆盖。

是的,我知道 RichTextBox 控件具有 SelectionChanged 事件。但是,我需要一个普通的 TextBox,而不是 RichTextBox。

【问题讨论】:

  • stackoverflow.com/questions/647963/… 有这个..据我所知,这是唯一可行的方法
  • 是的,我读到了,我对 RichTextBox 控件的主要问题是缺少精确的选择控件;它喜欢总是自动为我突出显示整个单词,即使 AutoWordSelection 属性设置为 false。 stackoverflow.com/questions/3678620/… 有一个解决方案,但我还是更喜欢使用普通的 TextBox。
  • 您唯一的其他选择取决于您为什么需要使用它。您可以查看 DataBinding 并将 selectionlength 属性绑定到控件?
  • 老实说,我一直在寻找更 KISS 风格的解决方案。所以真的没有办法在 TextBox 控件中实现等效的 SelectionChanged 事件吗?
  • 我不知道抱歉,我不认为文本框足够聪明,除了使用其选择开始和长度之外,它们的选择不会做任何事情

标签: c# .net winforms events textbox


【解决方案1】:

我不知道如何通过TextBox 实现您的目标,但下面是使用继承和自定义组件的解决方案示例。 SelectionChanged 事件将在用户通过鼠标选择一些新文本后引发。

请注意,MouseDownMouseUp 事件以及 SelectionStartSelectionLength 属性在 TextBox 中是公共的,因此您可以在需要时避免子类化。

class CustomTextBox : TextBox
{
    public event EventHandler SelectionChanged;

    private int _selectionStart;
    private int _selectionLength;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        _selectionStart = SelectionStart;
        _selectionLength = SelectionLength;

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (null != SelectionChanged && (_selectionStart != SelectionStart || _selectionLength != SelectionLength))
            SelectionChanged(this, EventArgs.Empty);

        base.OnMouseUp(e);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多