FlexGrid for WinForms
クリップボード

FlexGrid では、編集可能なグリッドデータに対して切り取り、コピー、貼り付けなどのさまざまなクリップボード操作を柔軟に行うことができます。一般的なクリップボードキーの自動処理を有効にするには、AutoClipboard プロパティを true に設定する必要があります。このプロパティは、以下のクリップボード操作と、それに対応するキーを処理します。

コピー

Ctrl+C、Ctrl+Ins

切り取り Ctrl+X、Shift+Del
貼り付け Ctrl+V、Shift+Ins
削除 Del

前述のクリップボード操作は、スタイルと画像には影響しません。グリッドヘッダーとデータに対してのみ作用します。選択したコンテンツのどの部分を行ヘッダー、列ヘッダー、およびデータからコピーするかは、ClipboardCopyMode プロパティを使用して指定できます。コピー範囲にデータマップまたは複数列コンボボックスが存在する場合は、表示値のみがコピーされます。また、セル範囲をコピーすると、非表示のセルもコピーされます。 非表示のセルをコピーから除外する方法については、「非表示セルの除外」を参照してください。

以下のコードは、WinForms FlexGrid でクリップボード操作を有効にする方法を示します。

// キーボードからクリップボード操作を有効にします
   c1FlexGrid1.AutoClipboard = true;
   
// データとすべてのヘッダーをコピーするようにコピーモードを設定します
   c1FlexGrid1.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndAllHeaders;
' キーボードからクリップボード操作を有効にします
c1FlexGrid1.AutoClipboard = True

' データとすべてのヘッダーをコピーするようにコピーモードを設定します
c1FlexGrid1.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndAllHeaders

コードによるクリップボード操作

クリップボード操作をコードで行うこともできます。次の例は、ボタンクリックでコピーおよび貼り付け操作を行う方法を示します。

WinForms FlexGrid においてコードでクリップボード操作を実行するには、次のコードを使用します。

private void CopyButton_Click(object sender, EventArgs e)
{
 // クリップボードにコピーするグリッドのデータのみをコピーできるようにします
    c1FlexGrid1.ClipboardCopyMode = ClipboardCopyModeEnum.DataOnly;

 // Clipプロパティに改行コードを追加し、クリップボードに設定します
    Clipboard.SetDataObject(c1FlexGrid1.Clip + "\r");
    MessageBox.Show($"Copied Range: [{c1FlexGrid1.Row},{c1FlexGrid1.Col}]-[{c1FlexGrid1.RowSel},{c1FlexGrid1.ColSel}]");
}

private void PasteButton_Click(object sender, EventArgs e)
{
 // クリップボードのテキストを取得します
    IDataObject data = Clipboard.GetDataObject();
    if (data.GetDataPresent(DataFormats.Text))
    {
        string str1, str2;
     // クリップボードからデータを取得します
        str1 = (string)data.GetData(DataFormats.Text);

     // クリップボードから最後の行のフィードコードを削除します
        str2 = str1.Remove(str1.Length - 1, 1);

     // 範囲を選択してデータを貼り付けます
        c1FlexGrid1.Select(c1FlexGrid1.Row, c1FlexGrid1.Col, c1FlexGrid1.Rows.Count - 1, c1FlexGrid1.Cols.Count - 1, true);
        c1FlexGrid1.Clip = str2;
        c1FlexGrid1.Select(c1FlexGrid1.Row, c1FlexGrid1.Col);
    }
Private Sub CopyButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' クリップボードにコピーするグリッドのデータのみをコピーできるようにします
    c1FlexGrid1.ClipboardCopyMode = ClipboardCopyModeEnum.DataOnly

    ' Clipプロパティに改行コードを追加し、クリップボードに設定します
    Clipboard.SetDataObject(c1FlexGrid1.Clip & Microsoft.VisualBasic.Constants.vbCr)
    MessageBox.Show($"Copied Range: [{c1FlexGrid1.Row},{c1FlexGrid1.Col}]-[{c1FlexGrid1.RowSel},{c1FlexGrid1.ColSel}]")
End Sub

Private Sub PasteButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' クリップボードのテキストを取得します
    Dim data As IDataObject = Clipboard.GetDataObject()

    If data.GetDataPresent(DataFormats.Text) Then
        Dim str1, str2 As String
        ' クリップボードからデータを取得します
        str1 = CStr(data.GetData(DataFormats.Text))

        ' クリップボードから最後の行のフィードコードを削除します
        str2 = str1.Remove(str1.Length - 1, 1)

        ' 範囲を選択してデータを貼り付けます
        c1FlexGrid1.Select(c1FlexGrid1.Row, c1FlexGrid1.Col, c1FlexGrid1.Rows.Count - 1, c1FlexGrid1.Cols.Count - 1, True)
        c1FlexGrid1.Clip = str2
        c1FlexGrid1.Select(c1FlexGrid1.Row, c1FlexGrid1.Col)
    End If

非表示セルの除外

FlexGrid では、AutoClipboard プロパティを使用して有効にしたキーボード操作でセル範囲をコピーすると、デフォルトで非表示セルもコピーされます。ただし、次のコードを使用して、非表示の行や列を除外できます。

次のコードは、WinForms のツリーグリッドで行われるクリップボード操作から非表示のセルを除外する方法を示します。

// 列を非表示にします
c1FlexGrid1.Cols[2].Visible = false;
c1FlexGrid1.AutoClipboard = true;
        

// 次に、Ctrl + Cを押す前に、非表示の列を含むいくつかのセルを選択します
private void c1FlexGrid1_KeyDown_1(object sender, KeyEventArgs e)
{
 
        // [Ctrl + C]でコピーします
        if ((e.Control == true) && (e.KeyCode == Keys.C))
        {
            // 自動処理が行われないため、キー入力を無効にします
            e.Handled = true;
            // 選択したセル範囲のCellRangeオブジェクトを取得します
            C1.Win.C1FlexGrid.CellRange cr;
            cr = c1FlexGrid1.Selection;

            string StrCopy = "";
            for (int i = cr.r1; i <= cr.r2; i++)
            {
                if (c1FlexGrid1.Rows[i].Visible == true)
                {
                    for (int j = cr.c1; j <= cr.c2; j++)
                    {
                        if (c1FlexGrid1.Cols[j].Visible == true)
                        {
                            StrCopy = StrCopy + c1FlexGrid1[i, j].ToString();
                            if (j != cr.c2)
                            {
                                StrCopy = StrCopy + "\t";
                            }
                        }
                    }
                    StrCopy = StrCopy + "\n";
                }
            }
            // クリップボードに設定します
            Clipboard.SetDataObject(StrCopy);
            MessageBox.Show("Copied data: \n" + StrCopy);
        }
  
}
    ' 列を非表示にします
    c1FlexGrid1.Cols(2).Visible = False
    c1FlexGrid1.AutoClipboard = True
        

' 次に、Ctrl + Cを押す前に、非表示の列を含むいくつかのセルを選択します
Private Sub c1FlexGrid1_KeyDown_1(ByVal sender As Object, ByVal e As KeyEventArgs)

    ' [Ctrl + C]でコピーします
    If e.Control = True AndAlso e.KeyCode = Keys.C Then
        ' 自動処理が行われないため、キー入力を無効にします
        e.Handled = True
        ' 選択したセル範囲のCellRangeオブジェクトを取得します
        Dim cr As C1.Win.C1FlexGrid.CellRange
        cr = c1FlexGrid1.Selection
        Dim StrCopy = ""

        For i = cr.r1 To cr.r2

            If c1FlexGrid1.Rows(i).Visible = True Then
                For j = cr.c1 To cr.c2

                    If c1FlexGrid1.Cols(j).Visible = True Then
                        StrCopy = StrCopy & c1FlexGrid1(i, j).ToString()

                        If j <> cr.c2 Then
                            StrCopy = StrCopy & Microsoft.VisualBasic.Constants.vbTab
                        End If
                    End If
                Next

                StrCopy = StrCopy & Microsoft.VisualBasic.Constants.vbLf
            End If
        Next
        ' クリップボードに設定します
        Clipboard.SetDataObject(StrCopy)
        MessageBox.Show("Copied data: " & Microsoft.VisualBasic.Constants.vbLf & StrCopy)
    End If
End Sub
関連トピック