c# 拖拽文件到控件

///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.

///拖动的对象需要从这两个事件的参数中获取,及从e中获得.

先要把你想接受拖放功能的控件的AllowDrop功能打开.

        this.textBox2.AllowDrop = true;  
        this.textBox2.Multiline = true;
private void textBox2_DragDrop(object sender, DragEventArgs e)
        {
            ///创建一个数组类,用于保存拖动进来的数据组,这里是文件名路径的数组(多个文件拖进来的情况)
            ///e.Data.GetData方法就是获取文件名数组的功能,参数是决定关联哪种数据格式.
            ///这里运用了把 Object 强制转换为 Array 的特点.
            Array aryFiles = ((System.Array)e.Data.GetData(DataFormats.FileDrop));
            for (int i = 0; i < aryFiles.Length; i++)
            {
                ///通过For循环把所有文件路径加到字符串label4.text里面.
                label4.Text = aryFiles.GetValue(i).ToString();// +Environment.NewLine;
            }
            path = label4.Text;
        }
        private void textBox2_DragEnter(object sender, DragEventArgs e)
        {
            ///拖进来时,判断拖动的数据是否是指定数据格式,并设置e.Effect的图标样式.
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Move;
            else e.Effect = DragDropEffects.None;
//这里说明一下,e传进来的数据,我个人觉得应用这样判断,因为其原理是:应该用e.AllowedEffect.ToString()来判断总共源(发起方)支持哪些拖放操作.

如果发起方支持多种拖放操作时,用上面的判断就要注意选择结果的唯一性.否则前面的拖放样式就很可能由于本发起方有多种拖放操作及满足MOVE又满足
//LINK而又去选择后面代码中的拖放效果,从而使其前面代码应该拥有的脱发效果失效,最终不能实现拖放操作.
比较清晰的判断方式可以用下面这种判断方法:
    if (e.AllowedEffect.ToString().Contains("Copy") && !e.AllowedEffect.ToString().Contains("Link"))
            e.Effect = DragDropEffects.Copy;
        if (e.AllowedEffect.ToString() == "Link")
            e.Effect = DragDropEffects.Link;
拖放操作,内存流操作,编码转换,二义性的问题.
“`C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void button1_Click(object sender, EventArgs e)
    {
        //Clipboard.Clear();//清空剪切板
        //Clipboard.SetText("中国", TextDataFormat.Text);//向剪切板中填充ANSI编码的UNICODE字符串
        //Clipboard.SetText("中国", TextDataFormat.UnicodeText);//向剪切板中填充UNICODE编码的UNICODE字符串
        //Clipboard.SetText("http://www.baidu.com", TextDataFormat.Html);//向剪切板填充html格式内容的字符串
        //向剪切板填充自定义对象,并指定关联的格式,便于监听或获取自定义数据
        //string myobj = "*";//要填充的对象
        //DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");//先自定义一种格式
        //DataObject myDataObject = new DataObject(DataFormats.Text, myobj);//在创建对象时连同格式一起关联起来
        //Clipboard.SetDataObject(myDataObject);//向剪切板中填充自定义数据对象
        IDataObject idata=Clipboard.GetDataObject();//通过通用的数据接口来操作剪切板中的数据
        for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
        {
            MessageBox.Show(i.ToString());
            MessageBox.Show(idata.GetFormats()[i]);
        }
        //处理html剪贴板的情况:
        if (idata.GetDataPresent(DataFormats.Html))
        {
            //处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
            //下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
            //为了在ANSI模式下正确显示,
            //因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
            MemoryStream vmemorystream = idata.GetData("Html Format") as MemoryStream;
            //这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
            //估计是编译器的一个BUG吧,不能选"DataFormats.Html"
            //as 关键词就是安全的把object转换为MemoryStream 对象.
            vmemorystream.Position = 0;
            byte[] vbytes = new byte[vmemorystream.Length];
            vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
            //以上是读取内存流中的字节信息来填充字节数组
            textBox1.Text = Encoding.UTF8.GetString(vbytes);
            //最后:字节数组以指定编码的方式生成UNICODE的string.
        }
        /*
          IDataObject ido = Clipboard.GetDataObject();//获得数据接口
          if (ido.GetDataPresent(DataFormats.Text,false))
          {//判断剪切板上的数据类型
              Text = (string)ido.GetData(DataFormats.Text); //获取内容
          }
        */
    }
    private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
    {
        System.Diagnostics.Process.Start(e.LinkText);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        Clipboard.SetText("陈佑忠", TextDataFormat.UnicodeText);
        IDataObject idata = Clipboard.GetDataObject();
        for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
        {
            MessageBox.Show(i.ToString());
            MessageBox.Show(idata.GetFormats()[i]);
        }
        MemoryStream ms = idata.GetData("unicodetext") as MemoryStream;
        ms.Position = 0;
        byte[] b = new byte[ms.Length];
        ms.Read(b, 0, (int)ms.Length);
        MessageBox.Show(((int)b[2]).ToString());
    }
//================================================拖放操作(注意:支持多种拖放样式时,在代码编写时的二义性)

    //通过判断不同的拖放样式,具体完成最终的拖放获取数据的工作
    private void textBox1_DragDrop(object sender, DragEventArgs e)
    {
        //获取网页内容,包括编码转换
        if (e.AllowedEffect.ToString().Contains("Copy")&&!e.AllowedEffect.ToString().Contains("Move"))
        {
            //处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
            //下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
            //为了在ANSI模式下正确显示,
            //因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
            MemoryStream vmemorystream = e.Data.GetData("Html Format") as MemoryStream;
            //这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
            //估计是编译器的一个BUG吧,不能选"DataFormats.Html"
            //as 关键词就是安全的把object转换为MemoryStream 对象.
            vmemorystream.Position = 0;
            byte[] vbytes = new byte[vmemorystream.Length];
            vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
            //以上是读取内存流中的字节信息来填充字节数组
            textBox1.Text = "";
            textBox1.Text = Encoding.UTF8.GetString(vbytes);
            //最后:字节数组以指定编码的方式生成UNICODE的string.
            richTextBox1.Text = "";//输出网页内容的纯文本
            richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();//输出网页内容的纯文本
        }
        //获取Rich文本和360浏览器地址栏文本
        if (e.AllowedEffect.ToString().Contains("Copy") && e.AllowedEffect.ToString().Contains("Move"))
        {
            //textBox1.Text = e.Data.GetData("Rich Text Format").ToString();//获取RICH源字符串
            textBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();
        }
        //获取IE超级连接地址
        if (e.AllowedEffect.ToString().Contains("Link"))
        {
            richTextBox1.Text = "";
            richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString()+‘\n‘;
        }
    }
//===================================================拖放判断与开关(没有打开相应的Effect是不能实现拖放的)

    //设置拖放样式(如果不设置,不能拖放)
    private void textBox1_DragOver(object sender, DragEventArgs e)
    {
         //MessageBox.Show(e.AllowedEffect.ToString());//判断拖放源支持哪些拖放效果
         if (e.AllowedEffect.ToString().Contains("Copy"))//拖放网页内容
             e.Effect = DragDropEffects.Copy;
         if (e.AllowedEffect.ToString() == "Link")//拖放超级连接
             e.Effect = DragDropEffects.Link;
    }
}
}

  

///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.

///拖动的对象需要从这两个事件的参数中获取,及从e中获得.

先要把你想接受拖放功能的控件的AllowDrop功能打开.

  1. this.textBox2.AllowDrop=true;
  2. this.textBox2.Multiline=true;
  1. privatevoid textBox2_DragDrop(object sender,DragEventArgs e)
  2. {
  3. ///创建一个数组类,用于保存拖动进来的数据组,这里是文件名路径的数组(多个文件拖进来的情况)
  4. ///e.Data.GetData方法就是获取文件名数组的功能,参数是决定关联哪种数据格式.
  5. ///这里运用了把 Object 强制转换为 Array 的特点.
  6. Array aryFiles =((System.Array)e.Data.GetData(DataFormats.FileDrop));
  7. for(int i =0; i < aryFiles.Length; i++)
  8. {
  9. ///通过For循环把所有文件路径加到字符串label4.text里面.
  10. label4.Text= aryFiles.GetValue(i).ToString();// +Environment.NewLine;
  11. }
  12. path = label4.Text;
  13. }
  14. privatevoid textBox2_DragEnter(object sender,DragEventArgs e)
  15. {
  16. ///拖进来时,判断拖动的数据是否是指定数据格式,并设置e.Effect的图标样式.
  17. if(e.Data.GetDataPresent(DataFormats.FileDrop))
  18. e.Effect=DragDropEffects.Move;
  19. else e.Effect=DragDropEffects.None;
  • //这里说明一下,e传进来的数据,我个人觉得应用这样判断,因为其原理是:应该用e.AllowedEffect.ToString()来判断总共源(发起方)支持哪些拖放操作.

    • 如果发起方支持多种拖放操作时,用上面的判断就要注意选择结果的唯一性.否则前面的拖放样式就很可能由于本发起方有多种拖放操作及满足MOVE又满足
    • //LINK而又去选择后面代码中的拖放效果,从而使其前面代码应该拥有的脱发效果失效,最终不能实现拖放操作.
      比较清晰的判断方式可以用下面这种判断方法:
      1. if(e.AllowedEffect.ToString().Contains("Copy")&&!e.AllowedEffect.ToString().Contains("Link"))
      2. e.Effect=DragDropEffects.Copy;
      3. if(e.AllowedEffect.ToString()=="Link")
      4. e.Effect=DragDropEffects.Link;

    拖放操作,内存流操作,编码转换,二义性的问题.
    “`C#
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

  1. privatevoid button1_Click(object sender,EventArgs e)
  2. {
  3. //Clipboard.Clear();//清空剪切板
  4. //Clipboard.SetText("中国", TextDataFormat.Text);//向剪切板中填充ANSI编码的UNICODE字符串
  5. //Clipboard.SetText("中国", TextDataFormat.UnicodeText);//向剪切板中填充UNICODE编码的UNICODE字符串
  6. //Clipboard.SetText("http://www.baidu.com", TextDataFormat.Html);//向剪切板填充html格式内容的字符串
  7. //向剪切板填充自定义对象,并指定关联的格式,便于监听或获取自定义数据
  8. //string myobj = "*";//要填充的对象
  9. //DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");//先自定义一种格式
  10. //DataObject myDataObject = new DataObject(DataFormats.Text, myobj);//在创建对象时连同格式一起关联起来
  11. //Clipboard.SetDataObject(myDataObject);//向剪切板中填充自定义数据对象
  12. IDataObject idata=Clipboard.GetDataObject();//通过通用的数据接口来操作剪切板中的数据
  13. for(int i =0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
  14. {
  15. MessageBox.Show(i.ToString());
  16. MessageBox.Show(idata.GetFormats()[i]);
  17. }
  18. //处理html剪贴板的情况:
  19. if(idata.GetDataPresent(DataFormats.Html))
  20. {
  21. //处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
  22. //下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
  23. //为了在ANSI模式下正确显示,
  24. //因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
  25. MemoryStream vmemorystream = idata.GetData("Html Format")asMemoryStream;
  26. //这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
  27. //估计是编译器的一个BUG吧,不能选"DataFormats.Html"
  28. //as 关键词就是安全的把object转换为MemoryStream 对象.
  29. vmemorystream.Position=0;
  30. byte[] vbytes =newbyte[vmemorystream.Length];
  31. vmemorystream.Read(vbytes,0,(int)vmemorystream.Length);
  32. //以上是读取内存流中的字节信息来填充字节数组
  33. textBox1.Text=Encoding.UTF8.GetString(vbytes);
  34. //最后:字节数组以指定编码的方式生成UNICODE的string.
  35. }
  36. /*
  37. IDataObject ido = Clipboard.GetDataObject();//获得数据接口
  38. if (ido.GetDataPresent(DataFormats.Text,false))
  39. {//判断剪切板上的数据类型
  40. Text = (string)ido.GetData(DataFormats.Text); //获取内容
  41. }
  42. */
  43. }
  44. privatevoid richTextBox1_LinkClicked(object sender,LinkClickedEventArgs e)
  45. {
  46. System.Diagnostics.Process.Start(e.LinkText);
  47. }
  48. privatevoid button2_Click(object sender,EventArgs e)
  49. {
  50. Clipboard.SetText("陈佑忠",TextDataFormat.UnicodeText);
  51. IDataObject idata =Clipboard.GetDataObject();
  52. for(int i =0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
  53. {
  54. MessageBox.Show(i.ToString());
  55. MessageBox.Show(idata.GetFormats()[i]);
  56. }
  57. MemoryStream ms = idata.GetData("unicodetext")asMemoryStream;
  58. ms.Position=0;
  59. byte[] b =newbyte[ms.Length];
  60. ms.Read(b,0,(int)ms.Length);
  61. MessageBox.Show(((int)b[2]).ToString());
  62. }

//================================================拖放操作(注意:支持多种拖放样式时,在代码编写时的二义性)

  1. //通过判断不同的拖放样式,具体完成最终的拖放获取数据的工作
  2. privatevoid textBox1_DragDrop(object sender,DragEventArgs e)
  3. {
  4. //获取网页内容,包括编码转换
  5. if(e.AllowedEffect.ToString().Contains("Copy")&&!e.AllowedEffect.ToString().Contains("Move"))
  6. {
  7. //处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
  8. //下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
  9. //为了在ANSI模式下正确显示,
  10. //因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
  11. MemoryStream vmemorystream = e.Data.GetData("Html Format")asMemoryStream;
  12. //这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
  13. //估计是编译器的一个BUG吧,不能选"DataFormats.Html"
  14. //as 关键词就是安全的把object转换为MemoryStream 对象.
  15. vmemorystream.Position=0;
  16. byte[] vbytes =newbyte[vmemorystream.Length];
  17. vmemorystream.Read(vbytes,0,(int)vmemorystream.Length);
  18. //以上是读取内存流中的字节信息来填充字节数组
  19. textBox1.Text="";
  20. textBox1.Text=Encoding.UTF8.GetString(vbytes);
  21. //最后:字节数组以指定编码的方式生成UNICODE的string.
  22. richTextBox1.Text="";//输出网页内容的纯文本
  23. richTextBox1.Text= e.Data.GetData(DataFormats.UnicodeText).ToString();//输出网页内容的纯文本
  24. }
  25. //获取Rich文本和360浏览器地址栏文本
  26. if(e.AllowedEffect.ToString().Contains("Copy")&& e.AllowedEffect.ToString().Contains("Move"))
  27. {
  28. //textBox1.Text = e.Data.GetData("Rich Text Format").ToString();//获取RICH源字符串
  29. textBox1.Text= e.Data.GetData(DataFormats.UnicodeText).ToString();
  30. }
  31. //获取IE超级连接地址
  32. if(e.AllowedEffect.ToString().Contains("Link"))
  33. {
  34. richTextBox1.Text="";
  35. richTextBox1.Text= e.Data.GetData(DataFormats.UnicodeText).ToString()+‘\n‘;
  36. }
  37. }

//===================================================拖放判断与开关(没有打开相应的Effect是不能实现拖放的)

  1. //设置拖放样式(如果不设置,不能拖放)
  2. privatevoid textBox1_DragOver(object sender,DragEventArgs e)
  3. {
  4. //MessageBox.Show(e.AllowedEffect.ToString());//判断拖放源支持哪些拖放效果
  5. if(e.AllowedEffect.ToString().Contains("Copy"))//拖放网页内容
  6. e.Effect=DragDropEffects.Copy;
  7. if(e.AllowedEffect.ToString()=="Link")//拖放超级连接
  8. e.Effect=DragDropEffects.Link;
  9. }
  10. }

}

c# 拖拽文件到控件

上一篇:win10的vue.js的安装学习


下一篇:Idea快捷键大全(Windows)