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>