///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放. ///拖动的对象需要从这两个事件的参数中获取,及从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功能打开.
this.textBox2.AllowDrop=true;
this.textBox2.Multiline=true;
privatevoid 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;
}
privatevoid 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();
}
privatevoid 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")asMemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position=0;
byte[] vbytes =newbyte[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); //获取内容
}
*/
}
privatevoid richTextBox1_LinkClicked(object sender,LinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.LinkText);
}
privatevoid 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")asMemoryStream;
ms.Position=0;
byte[] b =newbyte[ms.Length];
ms.Read(b,0,(int)ms.Length);
MessageBox.Show(((int)b[2]).ToString());
}
//================================================拖放操作(注意:支持多种拖放样式时,在代码编写时的二义性)
//通过判断不同的拖放样式,具体完成最终的拖放获取数据的工作
privatevoid 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")asMemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position=0;
byte[] vbytes =newbyte[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是不能实现拖放的)
//设置拖放样式(如果不设置,不能拖放)
privatevoid 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;
}
}
}