【问题标题】:My RichTextBox's cut/copy/paste doesn't cut, copy, or paste我的 RichTextBox 的剪切/复制/粘贴无法剪切、复制或粘贴
【发布时间】:2017-07-30 03:14:15
【问题描述】:

这是我的代码:

void CutAction(object sender, EventArgs e)
{
    richTextBox2.Cut();
}

void CopyAction(object sender, EventArgs e)
{
    Clipboard.SetData(DataFormats.Rtf, richTextBox2.SelectedRtf);
    Clipboard.Clear();
}

void PasteAction(object sender, EventArgs e)
{
    if (Clipboard.ContainsText(TextDataFormat.Rtf))
    {
        richTextBox2.SelectedRtf
            = Clipboard.GetData(DataFormats.Rtf).ToString();
    }
}

private void richTextBox2_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {   //click event
        //MessageBox.Show("you got it!");
        ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
        MenuItem menuItem = new MenuItem("Cut");
        menuItem.Click += new EventHandler(CutAction);
        contextMenu.MenuItems.Add(menuItem);
        menuItem = new MenuItem("Copy");
        menuItem.Click += new EventHandler(CopyAction);
        contextMenu.MenuItems.Add(menuItem);
        menuItem = new MenuItem("Paste");
        menuItem.Click += new EventHandler(PasteAction);
        contextMenu.MenuItems.Add(menuItem);

        richTextBox2.ContextMenu = contextMenu;
    }
} 

我有两个问题:

  • 标记richTextbox2中的文字后,我需要模拟鼠标右键单击才能看到剪切粘贴复制菜单。
  • 当我单击“复制”后,我无法将其粘贴到任何地方,因为没有可粘贴的内容。我还没有测试剪切和粘贴选项,但复制后它不起作用。

【问题讨论】:

  • CopyAction被调用时,你设置剪贴板然后清除它。我确定这不是你的意思。
  • @ColeJohnson 是的,忽略了它。
  • @ColeJohnson “它位于代码的顶部”与它有什么关系?如果您清除剪贴板,则单击“复制”菜单项时数据消失了,那么您就没有什么可粘贴的了。
  • @N4TKD 是给King King 的回复,他没有注意到CopyAction 方法,所以我说它在代码块的顶部。

标签: c# .net winforms richtextbox copy-paste


【解决方案1】:

删除Clipboard.Clear();

void CopyAction(object sender, EventArgs e) {
  Clipboard.SetData(DataFormats.Rtf, richTextBox2.SelectedRtf);            
}

您也可以使用RichTextBoxCopy() 方法:

void CopyAction(object sender, EventArgs e) {
 richTextBox2.Copy();
}

粘贴:

void PasteAction(object sender, EventArgs e) {
   if (Clipboard.ContainsText(TextDataFormat.Rtf)) {
      SendKeys.Send("^v");
   } 
}

【讨论】:

  • 打败我吧... -_-
  • 好的,它现在可以工作了,但是粘贴只在richTextBox2 控件上工作。如果我希望粘贴在 cgrome 或我拥有的文本文件或其他任何地方的任何其他窗口上工作?
  • @DoronMuzar 这有点复杂,理论上你必须检测焦点窗口并向该窗口发送一些WM_PASTE 消息。
  • @DoronMuzar 还有一个更简单的选择,请参阅更新。
【解决方案2】:
private void btnCopy_Click(object sender, EventArgs e)
{
    richTextBox1.SelectAll();
    richTextBox1.Copy();
}

private void btnPaste_Click(object sender, EventArgs e)
{
    richTextBox2.Paste();
}

private void btnCut_Click(object sender, EventArgs e)
{
    richTextBox1.SelectAll();
    richTextBox1.Cut();
}

注意:windows 窗体内置了将文本从richTextBox 复制到剪贴板的方法。 例如复制、粘贴、剪切(您必须先选择要复制或剪切的文本。在我的示例中,我选择了所有文本)。

在这个例子中基本上它会将内容复制到剪贴板,仍然有重载方法请参阅方法的定义。

【讨论】:

    【解决方案3】:

    尝试加toolstripbar,加3toolstripbuttons。这是复制、剪切和粘贴的代码

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        SendKeys.Send("^x");
    }
    
    private void toolStripButton2_Click(object sender, EventArgs e)
    {
        SendKeys.Send("^v");
    }
    
    private void toolStripButton3_Click(object sender, EventArgs e)
    {
        SendKeys.Send("^c");
    }
    

    代码直接使用剪贴板。

    【讨论】:

      【解决方案4】:

      感谢您的回答,Doron Muzar 先生

        private void richTextBox2_MouseUp(object sender, MouseEventArgs e)
         {
           if (e.Button == System.Windows.Forms.MouseButtons.Right)
             {   //click event
                 //MessageBox.Show("you got it!");
                 ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
                 MenuItem menuItem = new MenuItem("Cut");
                 menuItem.Click += new EventHandler(CutAction);
                 contextMenu.MenuItems.Add(menuItem);
                 menuItem = new MenuItem("Copy");
                 menuItem.Click += new EventHandler(CopyAction);
                 contextMenu.MenuItems.Add(menuItem);
                 menuItem = new MenuItem("Paste");
                 menuItem.Click += new EventHandler(PasteAction);
                 contextMenu.MenuItems.Add(menuItem);
      
                 richTextBox2.ContextMenu = contextMenu;
      }
      

      }

          void CutAction(object sender, EventArgs e)
          {
              richTextBox1.Cut();
          }
      
          void CopyAction(object sender, EventArgs e)
          {
              richTextBox1.Copy();
      
          }
      
          void PasteAction(object sender, EventArgs e)
          {`
              richTextBox1.Paste();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2013-05-13
        • 2012-05-07
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多