当前位置:编程学习 > C#/ASP.NET >>

关于DataGridView 复制乱码的问题,已经添加keyup事件,重写ctrl+C功能,但还有点问题,希望有高手解惑!

--------------------编程问答-------------------- 参考:
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有什么用呢?
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,