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

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

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

Re[3]: DataGridViewのコピー&ペーストは可能でしょうか?


(過去ログ 80 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■47470 / inTopicNo.1)  DataGridViewのコピー&ペーストは可能でしょうか?
  
□投稿者/ JIN (6回)-(2010/03/03(Wed) 17:59:02)

分類:[.NET 全般] 

お世話になります。
JINと申します。

VB.net 2008
OS:Windows XP
データベース:Oracle 11g

上記の環境でWindowsアプリを開発しています。

質問の内容は、タイトル通りです。

http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleDataGridPlus.html

上記のサイトのソースを参考に、
作成(DataGridViewのカラム幅をファイルへ保存/読込するための実装 を削除。)してみたのですが、

値が取得できず、
「オブジェクト参照がオブジェクトインスタンスに設定されていない」のエラーが発生してしまい、
全く使い物にならない始末です。

コピペに関しては、多くの方が実装できたらと考えていらっしゃると思うのですが、

実現させることは可能でしょうか。

もし可能であれば、方法をご教授していただきたいと思います。
よろしくお願いいたします。
引用返信 編集キー/
■47491 / inTopicNo.2)  Re[1]: DataGridViewのコピー&ペーストは可能でしょうか?
□投稿者/ ごう (85回)-(2010/03/04(Thu) 11:43:30)
こちらは調べてみましたか?
http://dobon.net/vb/dotnet/datagridview/clipboardcopy.html


引用返信 編集キー/
■47498 / inTopicNo.3)  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>

引用返信 編集キー/
■47505 / inTopicNo.4)  Re[3]: DataGridViewのコピー&ペーストは可能でしょうか?
□投稿者/ JIN (8回)-(2010/03/04(Thu) 15:37:56)
2010/03/04(Thu) 15:40:06 編集(投稿者)
No47498 (JIN さん) に返信

先に示しました、
Dim x As Integer = DataGridView1.CurrentCellAddress.X
Dim y As Integer = DataGridView1.CurrentCellAddress.Y

の問題でしたが、

Dim lbFlg As Boolean = False

'' ループ処理ではじめに選択されているセルを取得
For liRow As Integer = 0 To DataGridView1.Rows.Count - 1
    For liCol As Integer = 1 To DataGridView1.Columns.Count - 1
        If DataGridView1.Rows(liRow).Cells(liCol).Selected = True Then
           liIndex_X = liCol
           liIndex_Y = liRow
           
           '' インデックスが取得できたので、フラグをTrueに設定する
           lbFlg = True

           Exit For

        End If
    Next
    
    '' フラグがTrueなら、ループ処理を終了する。
    If lbFlg = True Then
       Exit For
    End If

Next

上記のループを貼り付けるイベントのはじめに実行することで、
DataGridViewの中で選択されているセルの一番低いインデックスを取得することができるようになりました。

社内の方と相談した結果、今回はここまでの動作で実装することといたしましたが、

Ctrl + Z による元に戻す機能など、足りない仕様があるのも事実ですので、
もう少し個人的に、DataGridViewのコピー&ペーストや切り取りなどの実装について調査をしていきたいと思います。

ごう様、
お答えしていただき、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -