文本框中是否有选择文本事件

时间:2016-03-30 12:26:58

标签: c# winforms

我正在创建一个小文本编辑器(就像记事本一样)。我的表单上有几个按钮(剪切,删除,复制)。我希望它们在没有选择文本时无法使用,反之亦然......当文本选择时是否会发生某些事件?我使用文本框控件。

2 个答案:

答案 0 :(得分:7)

没有这样的事件,但幸运的是有解决方法:

1)在Application.Idle事件上通过您自己的更新用户界面执行此操作(我承认这不是最佳解决方案,但这通常是我最喜欢的,因为它更容易实现):

Application.Idle += OnIdle;

然后:

private void OnIdle(object sender, EventArgs e) {
    btnCopy.Enabled = txtEditor.SelectionLength > 0;
}

2)从RichTextControl派生你自己的班级(如果你必须处理巨大的文件而不是大文件)并处理EN_SELCHANGE通知(不是最好的解决方案)(最强大的一个也与每个IME兼容)看到周围)。概念证明(从MSDN中选择适当的值,不要忘记将ENM_SELCHANGE设置为EM_SETEVENTMASK):

public class TextBoxEx : TextBox {
    public event EventHandler SelectionChanged;

    protected override void WndProc(ref Message m) {
        base.WndProc(ref m);

        if (m.Msg == WM_NOTIFY && m.lParam == EN_SELCHANGE) {
            OnSelectionChanged(EventArgs.Empty);
        }
    }

    // ...
}

你可能会这样做但是......默认控件已经为你提供了这个功能:它有一个SelectionChanged事件。

如果您还支持剪贴板粘贴,请务必小心,因为您需要根据剪贴板内容更新粘贴按钮(然后更方便的位置再次位于Application.Idle)。在CanPaste()上调用RichTextControl和类似方法可能会破坏某些IME(see also In Idle cannot access RichTextControl or IME will not work)。

答案 1 :(得分:1)

如果您使用RichTextBox,则会有一个名为SelectedText的属性。您可以检查SelectedText是否为空:

if (richTextBox1.SelectedText.Length > 0){ //means there is a selection
}

将其与SelectionChanged事件相结合:

private void richTextBox1_SelectionChanged(object sender, EventArgs e) {
    bool enabled = richTextBox1.SelectedText.Length > 0;
    //do something
}

当有/不选择文字时,您可以控制启用/停用Control