DataGridView 剪切板的操作

DataGridView.ClipboardCopyMode 属性被设定为 DataGridViewClipboardCopyMode.Disable 以外的情况时,「Ctrl + C 按下的时候,被选择的单元格的内容会拷贝到系统剪切板内。格式有: Text UnicodeTextHtml CommaSeparatedValue。可以直接粘贴到 Excel 内。

ClipboardCopyMode 
还可以设定 Header部分是否拷贝: EnableAlwaysIncludeHeaderText 拷贝Header部分、EnableWithoutHeaderText 则不拷贝。默认是 EnableWithAutoHeaderText  Header 如果选择了的话,就拷贝。

1
 编程方式实现剪切板的拷贝

Clipboard.SetDataObject(DataGridView1.GetClipboardContent()) 

2) DataGridView 
的数据粘贴

实现剪切板的拷贝比较容易,但是实现 DataGridView 的直接粘贴就比较难了。「Ctrl + V」按下进行粘贴时,DataGridView 没有提供方法,只能自己实现。

以下,是粘贴时简单的事例代码,将拷贝数据粘贴到以选择单元格开始的区域内。

[VB.NET]
当前单元格是否选择的判断
If DataGridView1.CurrentCell Is Nothing Then
    
Return
End If
Dim insertRowIndex As Integer = DataGridView1.CurrentCell.RowIndex

获取剪切板的内容,并按行分割
Dim pasteText As String = Clipboard.GetText()
If String.IsNullOrEmpty(pasteText) Then
    
Return
End If
pasteText = pasteText.Replace(vbCrLf, vbLf)
pasteText = pasteText.Replace(vbCr, vbLf)
pasteText.TrimEnd(
New Char() {vbLf})
Dim lines As String() = pasteText.Split(vbLf)

Dim isHeader As Boolean = True
For Each line As String In lines
    
是否是列头
    If isHeader Then
        isHeader = 
False
    
Else
        
 Tab 分割数据
        Dim vals As String() = line.Split(ControlChars.Tab)
        
判断列数是否统一
        If vals.Length - 1 <> DataGridView1.ColumnCount Then
            
Throw New ApplicationException("粘贴的列数不正确。")
        
End If
        
Dim row As DataGridViewRow = DataGridView1.Rows(insertRowIndex)
        
行头设定
        row.HeaderCell.Value = vals(0)
        
单元格内容设定
        Dim i As Integer
        
For i = 0 To row.Cells.Count - 1
            row.Cells(i).Value = vals((i + 1))
        
Next i

        
' DataGridView的行索引+1
        insertRowIndex += 1
    
End If
Next line

 

[C#]
//当前单元格是否选择的判断
if (DataGridView1.CurrentCell == null)
    
return;
int insertRowIndex = DataGridView1.CurrentCell.RowIndex;

// 获取剪切板的内容,并按行分割
string pasteText = Clipboard.GetText();
if (string.IsNullOrEmpty(pasteText))
    
return;
pasteText = pasteText.Replace(" ", " ");
pasteText = pasteText.Replace(' ', ' ');
pasteText.TrimEnd(
new char[] { ' ' });
string[] lines = pasteText.Split(' ');

bool isHeader = true;
foreach (string line in lines)
{
    
// 是否是列头
    if (isHeader)
    {
        isHeader = 
false;
        
continue;
    }

    
//  Tab 分割数据
    string[] vals = line.Split(' ');
    
// 判断列数是否统一
    if (vals.Length - 1 != DataGridView1.ColumnCount)
        
throw new ApplicationException("粘贴的列数不正确。");
    DataGridViewRow row = DataGridView1.Rows[insertRowIndex];
    
// 行头设定
    row.HeaderCell.Value = vals[0];
    
// 单元格内容设定
    for (int i = 0; i < row.Cells.Count; i++)
    {
        row.Cells[i].Value = vals[i + 1];
    }

    
//  DataGridView的行索引+1
    insertRowIndex++;
}




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/201789,如需转载请自行联系原作者

上一篇:操作database TableMeta几点内容


下一篇:MyBatis - (一) 基本数据操作命令和简单映射