【问题标题】:Detecting a paste into a RichTextBox检测粘贴到 RichTextBox 中
【发布时间】:2017-03-02 01:22:02
【问题描述】:

当文本被粘贴到 RichTextBox 时,是否有某种方法可以检测或触发事件?或者也许已经有某种事件在粘贴文本时触发?顺便说一下,这是 Winforms C#。

【问题讨论】:

    标签: c# winforms richtextbox copy-paste


    【解决方案1】:

    因为不是所有人都可以使用 Ctrl+V,而且还有其他方法可以将文本放入文本框中(例如拖放),所以我采用了不同的方法,我将在此处分享,以防其他人看到寻求解决方案。

    我所做的是在我的班级中创建一个字段:

    int _lastPosition = 0;
    

    在 TextChanged() 事件中,我添加了以下内容:

    if (SelectionStart - _lastPosition > 2)
    {
        // Text was pasted into text box
    }
    _lastPosition = SelectionStart;
    

    我假设如果一次在文本框中输入了超过 2 个字符,那么文本肯定已经被粘贴了,因为其他人怎么能一次输入超过 2 个字符呢?所以无论如何,这对我有用。感谢所有试图提供帮助的人。

    【讨论】:

    • +1,但为什么要检查超过 2 个字符而不是超过 1 个字符(即,有人如何在不粘贴的情况下放入 2 个字符?)。
    • @StephenSwensen 例如带回车
    【解决方案2】:

    Icemanminds 的答案无法正常工作,这确实会在您粘贴但有副作用时向您显示。

    如果您这样做,您还将在文本更改中输入 if 块,并带有一个空文本框 1.粘贴至少两行文字 2. 用箭头键上到第一行,按空格然后退格 3.用箭头键回到底线并按回车 当粘贴没有发生时,您现在会收到通知。

    编辑:这是解决问题的方法

    代码:

        protected override void OnSelectionChanged(EventArgs e)
        {
            base.OnSelectionChanged(e);
            int cavetOffset = SelectionStart - m_nLastCavetPos;
            int sizeOffset = Text.Length - m_nLastKnownSize;
            if (sizeOffset > 0)
            {
                if (sizeOffset == 1)
                    Console.WriteLine("Typed \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
                else if (sizeOffset > 1)
                    Console.WriteLine("Pasted \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
            }
            else if (sizeOffset == 0)
            {
                Console.WriteLine("Moved Caret to " + SelectionStart + " From " + m_nLastCavetPos);
            }
            else
            {
                if (sizeOffset == -1)
                    Console.WriteLine("Backspaced at " + (SelectionStart - cavetOffset));
                if (sizeOffset < -1)
                    Console.WriteLine("HiliteDelete at " + ((SelectionStart - cavetOffset)+-sizeOffset) + " deleted " + (-sizeOffset) + " characters");
            }
            m_nLastKnownSize = Text.Length;
            m_nLastCavetPos = SelectionStart;
        }
    

    【讨论】:

    • 我会调查这个,虽然我很着迷你是如何发现这个错误的,哈哈。
    • 查看我对帖子的编辑,我在做同样的事情。我必须看看何时出现粘贴。我只是以这样的方式粘贴,结果我把它弄坏了......运气不好?
    • 有太多不同的变量可以破坏它,您几乎只需要创建一个全新的文本框类就可以让它完美地工作。
    • 我只是重写了 ProcessCmdKey 方法,并没有让任何我不想处理的键通过,比如插入或删除
    【解决方案3】:

    无论如何,我都不是 C# 专家,事实上,我已经 3 年没有接触该语言了!但是,您可能希望使用 ProcessCmdKey 方法来侦听 CTRL + V

    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.71).aspx

    【讨论】:

      【解决方案4】:

      这是另一种类似的方法,用于检测是否发生了更改框中字符数的剪切或粘贴(它不会检测粘贴的字符数是否与突出显示的字符数相同): 首先创建一个类级成员来保存当前长度

      private int _LastTextLength = 0; 
      

      现在标记用户进入框的长度:

      private void txtNoteDetails_Enter(object sender, EventArgs e)
      {
          _LastTextLength = txtNoteDetails.Text.Length;
      }
      

      然后使用 TextChanged 事件:

      private void txtNoteDetails_TextChanged(object sender, EventArgs e)
      {
          if (Math.Abs(txtNoteDetails.Text.Length - _LastTextLength) > 2)
          {
              //Do your thing
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多