C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 80 を表示中)
■47498 / )  Re[2]: DataGridViewのコピー&ペーストは可能でしょうか?
□投稿者/ JIN (7回)-(2010/03/04(Thu) 13:39:43)
2010/03/04(Thu) 13:42:16 編集(投稿者)
2010/03/04(Thu) 13:41:52 編集(投稿者)
2010/03/04(Thu) 13:41:48 編集(投稿者)

<pre><pre>■No47491 (ごう さん) に返信
> こちらは調べてみましたか?
> http://dobon.net/vb/dotnet/datagridview/clipboardcopy.html

ごう様、回答ありがとうございます。

載せていただいたサイトのソースでも試してみたのですが、
動きとしては、私が始めに載せたサイトの方を修正したほうが工数がかからないと判断しました。

私が書いたソースは以下のとおりです。

'' KeyDoenでコピペを判断し、実行する。
Private Sub DataGridView1_KeyDown(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

        '' Ctrl + V
        If (e.Modifiers And Keys.Control) = Keys.Control And e.KeyCode = Keys.V Then

                Dim x As Integer = DataGridView1.CurrentCellAddress.X
                Dim y As Integer = DataGridView1.CurrentCellAddress.Y

                ' クリップボードの内容を取得
                Dim clipText As String = Clipboard.GetText()

                ' 改行を変換
                clipText = clipText.Replace(vbCrLf, vbLf)
                clipText = clipText.Replace(vbCr, vbLf)

                ' 改行で分割
                Dim lines() As String = clipText.Split(vbLf)

                Dim r As Integer
                Dim nflag As Boolean = True

                For r = 0 To lines.GetLength(0) - 1

                    ' 最後のNULL行をコピーするかどうか
                    If r >= lines.GetLength(0) - 1 And _
                       "".Equals(lines(r)) And nflag = False Then Exit For
                    If "".Equals(lines(r)) = False Then nflag = False

                    ' タブで分割
                    Dim vals() As String = lines(r).Split(vbTab)

                    ' 各セルの値を設定
                    Dim c As Integer = 0
                    Dim c2 As Integer = 0
                    Dim pststr As String = ""

                    For c = 0 To vals.GetLength(0) - 1

                        ' セルが存在しなければ貼り付けない
                        If Not (x + c2 >= 0 And x + c2 < DataGridView1.ColumnCount And _
                                y + r >= 0 And y + r < DataGridView1.RowCount) Then
                            Continue For
                        End If

                        ' 非表示セルには貼り付けない
                        If DataGridView1(x + c2, y + r).Visible = False Then
                            c2 = c2 + 1
                            c = c - 1
                            Continue For
                        End If

                        
                        '' 格納する文字列を再び空文字に設定する
                        pststr = String.Empty

                        For i As Long = 0 To vals(c).Length - 1
                            _editingColumn = x + c2
                            Dim tmpe As KeyPressEventArgs = _
                                New KeyPressEventArgs(vals(c).Substring(i, 1))
                            
                            '' Falseに設定
                            tmpe.Handled = False
                            If tmpe.Handled = False Then
                                pststr = pststr & vals(c).Substring(i, 1)
                            End If
                        Next

                        '' 行追加モード&最終行の時は行追加
                        If y + r = DataGridView1.RowCount - 1 And _
                         DataGridView1.AllowUserToAddRows = True Then
                            Dim bs As New BindingSource
                            Dim ds As New DataSet
                            bs = DirectCast(DataGridView1.DataSource, BindingSource)
                            ds = DirectCast(bs.DataSource, DataSet)
                            ds.Tables(0).AcceptChanges()
                        End If

                        '' 貼り付け
                        If IsNumeric(pststr) = True Then
                            DataGridView1(x + c2, y + r).Value = pststr
                        End If


                        '' 次のセルへ
                        c2 = c2 + 1

                    Next
                Next

            End If
End Sub

KeyDownのイベントで、Ctrl + V が押下された場合、
クリップボードの値を一文字づつ読み込み、
選択されているセルに値として代入するやり方です。

現在の問題としましては、
Dim x As Integer = DataGridView1.CurrentCellAddress.X
Dim y As Integer = DataGridView1.CurrentCellAddress.Y

ですと、最後に選択されたセルのインデックスを、一番初めに貼り付けるセルと判断してしまうことです。

たとえば、
0列目 〜 2列目までを選択した状態で、貼り付けを行うと、

2列目 〜 4列目に値を貼り付けてしまうのです。

すみません、意味が通じにくいかとは思うのですが、

0列目 〜 2列目を選択していた場合、
そのままその位置に貼り付けたいのですが、
現在、他の取得方法を模索中のところです。</pre></pre>

返信 編集キー/


管理者用

- Child Tree -