本帖最后由 leo_t_t 于 2011-11-17 09:53:59 编辑

解决方案 »

  1.   

    参考:
    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;    
         }    
    }  
      

  2.   

    谢谢hefeng_aspnet,终于明白问题在哪儿的了,你代码里ProcessInsertKey有什么用呢?