如何:在 Windows 窗体 RichTextBox 控件中启用拖放操作

更新:2007 年 11 月

Windows 窗体 RichTextBox 控件中的拖放操作是通过处理 DragEnterDragDrop 事件来完成的。因此,RichTextBox 控件中的拖放操作是非常简单的。

在 RichTextBox 控件中启用拖动操作

  1. RichTextBox 控件的 AllowDrop 属性设置为 true。

  2. DragEnter 事件的事件处理程序中编写代码。使用 if 语句来确保所拖动的数据类型为可接受的类型(在本示例中为文本类型)。DragEventArgs.Effect 属性可以设置为 DragDropEffects 枚举的任何值。

    Private Sub RichTextBox1_DragEnter(ByVal sender As Object, _ 
       ByVal e As System.Windows.Forms.DragEventArgs) _ 
       Handles RichTextBox1.DragEnter
       If (e.Data.GetDataPresent(DataFormats.Text)) Then
          e.Effect = DragDropEffects.Copy
       Else
          e.Effect = DragDropEffects.None
       End If
    End Sub
    
    private void richTextBox1_DragEnter(object sender, 
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.Text)) 
          e.Effect = DragDropEffects.Copy;
       else
          e.Effect = DragDropEffects.None;
    }
    
    private void richTextBox1_DragEnter(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.get_Data().GetDataPresent(DataFormats.Text))
          e.set_Effect(DragDropEffects.Copy);
       else
          e.set_Effect(DragDropEffects.None);
    }
    
    private:
       void richTextBox1_DragEnter(System::Object ^  sender,
          System::Windows::Forms::DragEventArgs ^  e)
       {
          if (e->Data->GetDataPresent(DataFormats::Text))
             e->Effect = DragDropEffects::Copy;
          else
             e->Effect = DragDropEffects::None;
       }
    

    ((Visual C#、Visual J# 和 Visual C++)在窗体的构造函数中放置以下代码,以注册事件处理程序。

    this.richTextBox1.DragEnter += new
        System.Windows.Forms.DragEventHandler
        (this.richTextBox1_DragEnter);
    
    this.richTextBox1.add_DragEnter(new
       System.Windows.Forms.DragEventHandler(
          this.richTextBox1_DragEnter));
    
    this->richTextBox1->DragEnter += gcnew
       System::Windows::Forms::DragEventHandler
       (this, &Form1::richTextBox1_DragEnter);
    
  3. 编写代码以处理 DragDrop 事件。使用 DataObject.GetData 方法检索被拖动的数据。

    在下面的示例中,代码将 RichTextBox 控件的 Text 属性设置为等于所拖动的数据。如果在 RichTextBox 控件中已有文本存在,则所拖动的文本在插入点处插入。

    Private Sub RichTextBox1_DragDrop(ByVal sender As Object, _ 
       ByVal e As System.Windows.Forms.DragEventArgs) _ 
       Handles RichTextBox1.DragDrop
       Dim i As Int16 
       Dim s As String
    
       ' Get start position to drop the text.
       i = RichTextBox1.SelectionStart
       s = RichTextBox1.Text.Substring(i)
       RichTextBox1.Text = RichTextBox1.Text.Substring(0, i)
    
       ' Drop the text on to the RichTextBox.
       RichTextBox1.Text = RichTextBox1.Text + _
          e.Data.GetData(DataFormats.Text).ToString()
       RichTextBox1.Text = RichTextBox1.Text + s
    End Sub
    
    private void richTextBox1_DragDrop(object sender, 
    System.Windows.Forms.DragEventArgs e)
    {
       int i;
       String s;
    
       // Get start position to drop the text.
       i = richTextBox1.SelectionStart;
       s = richTextBox1.Text.Substring(i);
       richTextBox1.Text = richTextBox1.Text.Substring(0,i);
    
       // Drop the text on to the RichTextBox.
       richTextBox1.Text = richTextBox1.Text + 
          e.Data.GetData(DataFormats.Text).ToString();
       richTextBox1.Text = richTextBox1.Text + s;
    }
    
    private void richTextBox1_DragDrop(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       int i;
       String s;
    
       // Get start position to drop the text.
       i = richTextBox1.get_SelectionStart();
       s = richTextBox1.get_Text().Substring(i);
       richTextBox1.set_Text(richTextBox1.get_Text().Substring(0, i));
    
       // Drop the text on to the RichTextBox.
       richTextBox1.set_Text(richTextBox1.get_Text() +
          e.get_Data().GetData(DataFormats.Text).ToString());
       richTextBox1.set_Text(richTextBox1.get_Text() + s);
    }
    
    private:
       System::Void richTextBox1_DragDrop(System::Object ^  sender,
          System::Windows::Forms::DragEventArgs ^  e)
       {
          int i;
          String ^s;
    
       // Get start position to drop the text.
       i = richTextBox1->SelectionStart;
       s = richTextBox1->Text->Substring(i);
       richTextBox1->Text = richTextBox1->Text->Substring(0,i);
    
       // Drop the text on to the RichTextBox.
       String ^str = String::Concat(richTextBox1->Text, e->Data
       ->GetData(DataFormats->Text)->ToString()); 
       richTextBox1->Text = String::Concat(str, s);
       }
    

    ((Visual C#、Visual J# 和 Visual C++)在窗体的构造函数中放置以下代码,以注册事件处理程序。

    this.richTextBox1.DragDrop += new
        System.Windows.Forms.DragEventHandler
        (this.richTextBox1_DragDrop);
    
    this.richTextBox1.add_DragDrop(new System.Windows.Forms.DragEventHandler(this.richTextBox1_DragDrop));
    
    this->richTextBox1->DragDrop += gcnew 
       System::Windows::Forms::DragEventHandler
       (this, &Form1::richTextBox1_DragDrop);
    

在应用程序中测试拖放功能

  1. 保存并生成应用程序。在它运行时运行“写字板”。

    “写字板”是一个由 Windows 安装的文本编辑器,它允许进行拖放操作。可以通过下面的方法访问它:单击“开始”按钮,选择“运行”,在“运行”对话框中键入“WordPad”,然后单击“确定”。

  2. 打开“写字板”后,在其中键入一个文本字符串。用鼠标选定该文本,再将选定的文本拖动到 Windows 应用程序中的 RichTextBox 控件中。

    注意,将鼠标指向 RichTextBox 控件时(并由此引发 DragEnter 事件),鼠标指针将更改形状,此时可将选定的文本放入 RichTextBox 控件中。

    当释放鼠标按钮时,选定的文本就会被放下(即引发 DragDrop 事件),并被插入到 RichTextBox 控件中。

请参见

任务

如何:在应用程序之间执行拖放操作

参考

RichTextBox

其他资源

RichTextBox 控件(Windows 窗体)

在 Windows 窗体上使用的控件