1. 程式人生 > >DataGridView 剪下板的操作

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++;
}