关于DataGridView 复制乱码的问题,已经添加keyup事件,重写ctrl+C功能,但还有点问题,希望有高手解惑! 本帖最后由 leo_t_t 于 2011-11-17 09:53:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考:System.Windows.Forms.DataGridView控件以数据网络的方法呈现数据,可以非常方便的用它绑定数据源,不需要编辑多少代码就可以实现对数据源的增删改功能。偶然发现它有一个小小的问题,我们用快捷键复制(Ctrl+C/Ctrl+Insert)表格内容后,到常用的办公处理软件(如微软Office系列和Sun的OpenOffice)中粘贴,那么带有Unicode字符的内容会显示会乱码。使用反射工具查看了DataGridView控件对此功能的实现方法,是由于它直接采用了剪贴版类的SetDataObject方法而没有指定其格式,那么它的格式似乎被认为是ANSI的HTML格式+Unicode内容,所以直接粘贴到字处理软件或者表格处理软件(有时,微软Excel会因此无响应)显示出汉字等Unicode字符却成了乱码。 Clipboard.SetDataObject(clipboardContent); 此种情况可以利用“选择性粘贴”将其格式按“无格式文本”粘贴就可以了。 总不要是这样子,我们还可以编写一个DataGridView子类,重写ProcessDataGridViewKey方法,当它在处理“复制”的快捷键时用我们重新实现的ProcessInsertKey来完成任务,将复制剪贴板功能改为Unicode格式的SetText方法即可。代码如下(修改的剪贴板功能在29行): public class MyDataGridView : DataGridView { [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] protected override bool ProcessDataGridViewKey(KeyEventArgs e) { switch (e.KeyCode) { case Keys.Insert: case Keys.C: return this.ProcessInsertKey(e.KeyData); default: break; } return base.ProcessDataGridViewKey(e); } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] protected new bool ProcessInsertKey(Keys keyData) { if ((((keyData & (Keys.Alt | Keys.Control | Keys.Shift)) == Keys.Control) || (((keyData & (Keys.Alt | Keys.Control | Keys.Shift)) == (Keys.Control | Keys.Shift)) && ((keyData & Keys.KeyCode) == Keys.C))) && (this.ClipboardCopyMode != DataGridViewClipboardCopyMode.Disable)) { DataObject clipboardContent = this.GetClipboardContent(); if (clipboardContent != null) { //Clipboard.SetDataObject(clipboardContent); Clipboard.SetText(clipboardContent.GetData(DataFormats.UnicodeText).ToString()); return true; } } return false; } } 谢谢hefeng_aspnet,终于明白问题在哪儿的了,你代码里ProcessInsertKey有什么用呢? 求助,关于一个数据库的后序遍历问题 用手指点一下屏幕上的一个按钮(类似银行ATM),需要什么设备才能实现? 当CommandType属性为TableDirect时 怎么样用webBrowser依次打开超连接? 关于windowform窗体设计里的图标 请教一个关于GetField的问题 databind()绑定数据时总是报错 我修改DataGrid中的记录后,数据库中对应的记录并未发生任何变化,大家帮我看看是怎么回事.(winform) except的问题 有人愿意帮我编译个源码吗 求个程序能读EXCEL的数据填选择题 WebClient.DownloadFile()越来越慢
System.Windows.Forms.DataGridView控件以数据网络的方法呈现数据,可以非常方便的用它绑定数据源,不需要编辑多少代码就可以实现对数据源的增删改功能。偶然发现它有一个小小的问题,我们用快捷键复制(Ctrl+C/Ctrl+Insert)表格内容后,到常用的办公处理软件(如微软Office系列和Sun的OpenOffice)中粘贴,那么带有Unicode字符的内容会显示会乱码。使用反射工具查看了DataGridView控件对此功能的实现方法,是由于它直接采用了剪贴版类的SetDataObject方法而没有指定其格式,那么它的格式似乎被认为是ANSI的HTML格式+Unicode内容,所以直接粘贴到字处理软件或者表格处理软件(有时,微软Excel会因此无响应)显示出汉字等Unicode字符却成了乱码。 Clipboard.SetDataObject(clipboardContent); 此种情况可以利用“选择性粘贴”将其格式按“无格式文本”粘贴就可以了。 总不要是这样子,我们还可以编写一个DataGridView子类,重写ProcessDataGridViewKey方法,当它在处理“复制”的快捷键时用我们重新实现的ProcessInsertKey来完成任务,将复制剪贴板功能改为Unicode格式的SetText方法即可。代码如下(修改的剪贴板功能在29行): public class MyDataGridView : DataGridView
{
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Insert:
case Keys.C:
return this.ProcessInsertKey(e.KeyData);
default:
break;
}
return base.ProcessDataGridViewKey(e);
}
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected new bool ProcessInsertKey(Keys keyData)
{
if ((((keyData & (Keys.Alt | Keys.Control | Keys.Shift)) == Keys.Control) ||
(((keyData & (Keys.Alt | Keys.Control | Keys.Shift)) == (Keys.Control | Keys.Shift))
&& ((keyData & Keys.KeyCode) == Keys.C)))
&& (this.ClipboardCopyMode != DataGridViewClipboardCopyMode.Disable))
{
DataObject clipboardContent = this.GetClipboardContent();
if (clipboardContent != null)
{
//Clipboard.SetDataObject(clipboardContent);
Clipboard.SetText(clipboardContent.GetData(DataFormats.UnicodeText).ToString());
return true;
}
}
return false;
}
}