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

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

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

Re[5]: DataGridViewにてD&Dが失敗する


(過去ログ 124 を表示中)

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

■74115 / inTopicNo.1)  DataGridViewにてD&Dが失敗する
  
□投稿者/ 優希(ゆき) (18回)-(2014/12/01(Mon) 18:32:02)

分類:[VB.NET/VB2005 以降] 

2014/12/01(Mon) 18:51:49 編集(投稿者)
2014/12/01(Mon) 18:51:16 編集(投稿者)
【分類と少しソースの変更】

<pre><pre>環境:Win7 VB2010 Express

検索しても情報が見つからないので教えて下さい。

AというDataGridViewからBのDataGridViewにドラッグアンドドロップを行おうとすると
NullReferenceException が発生してしまうのですが回避する方法はありますでしょうか?

BのDataGridViewには処理によるデータソースと背景色が設定されます。

http://blogahf.blogspot.jp/2008/01/datagridview.html
上記ブログのソースを参考にしました。


下記がD&Dのソースになります。

Private Sub UIIList_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles A.MouseDown
'左クリックの検知
If e.Button = Windows.Forms.MouseButtons.Left Then


UIIlist.DoDragDrop(UIIlist.CurrentCell.Value, DragDropEffects.All)


End If

End Sub

Private Sub dgvDragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)

Dim dgvname As New DataGridView

If e.Data.GetDataPresent(GetType(String)) Then
Dim dgvcellvalue = e.Data.GetData(GetType(String))

dgvname = CType(sender, DataGridView)


dgvname.CurrentCell.Value = dgvcellvalue  ←【ここでNullReferenceException が発生】


End If

MessageBox.Show("ドラッグアンドドロップ完了")

End Sub

Private Sub dgvDragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)

e.Effect = DragDropEffects.Copy

End Sub

また、BのDataGridViewの数が可変(1〜20)になるため、addhandlerで動的に関連付けてあります。

上記ブログのソースをテストプログラムで実行した所、NullReferenceExceptionの問題は発生しませんでした。</pre></pre>
引用返信 編集キー/
■74116 / inTopicNo.2)  Re[1]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (19回)-(2014/12/01(Mon) 18:36:00)
したいことは、AのDataGridViewのセルのデータをBのセルへドラッグアンドドロップし、そのBのセルに対応したデータと関連付ける事になります。
引用返信 編集キー/
■74117 / inTopicNo.3)  Re[2]: DataGridViewにてD&Dが失敗する
□投稿者/ shu (635回)-(2014/12/01(Mon) 18:42:45)
No74116 (優希(ゆき) さん) に返信

> dgvname.CurrentCell.Value = dgvcellvalue  ←【ここでNullReferenceException が発生】
どこがNothingになっているかです。
一番あやしいのはCurrentCellではないかと思います。
ドロップした位置より該当セルを探すのがよいかと思います。

引用返信 編集キー/
■74118 / inTopicNo.4)  Re[1]: DataGridViewにてD&Dが失敗する
□投稿者/ ヴァン (8回)-(2014/12/01(Mon) 18:45:35)
こんにちは。

No74115 (優希(ゆき) さん) に返信
> dgvname = CType(sender, DataGridView)
>
>
> dgvname.CurrentCell.Value = dgvcellvalue  ←【ここでNullReferenceException が発生】

dgvname または CurrentCell が null(Nothing) の可能性が高いです。
sender には DataGridView が入ってきますか?

引用返信 編集キー/
■74119 / inTopicNo.5)  Re[3]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (20回)-(2014/12/01(Mon) 18:50:42)
shuさん、ヴァンさんありがとうございます。

確認した所、senderにはDataGridViewは入ってきています。

nullになっているのは指摘の通りCurrentCellの箇所になります。


引用返信 編集キー/
■74142 / inTopicNo.6)  Re[2]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (21回)-(2014/12/03(Wed) 09:19:53)
遅くなってすみません。

shuさんの回答から探した所、ドロップした位置からセルを特定できる方法があり、参考にした
ブログでもコメントに書かれていたので下記コードに変更しましたが次は「ArgumentOutOfRangeException」が発生してしまいました。

データとしてはX,Y座標は取得できていますが、そこからDataGridViewの
セル位置に変換する際に[-1,-1]となってしまいエラーが発生している模様です。



    Private Sub dgvDragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)

        '変数
        Dim dgvname As New DataGridView


        If e.Data.GetDataPresent(GetType(String)) Then
            Dim dgvcellvalue = e.Data.GetData(GetType(String))

            dgvname = CType(sender, DataGridView)

            Dim hti As DataGridView.HitTestInfo = DirectCast(sender, DataGridView).HitTest(e.X, e.Y)

            dgvname(hti.ColumnIndex, hti.RowIndex).Value = dgvcellvalue ←【ここでArgumentOutOfRangeExceptionが発生】

            MessageBox.Show("ドラッグアンドドロップ完了")

        End If



    End Sub

引用返信 編集キー/
■74143 / inTopicNo.7)  Re[3]: DataGridViewにてD&Dが失敗する
□投稿者/ Hongliang (254回)-(2014/12/03(Wed) 09:39:35)
> データとしてはX,Y座標は取得できていますが、
本当ですか? DragEventArgsのX, Yはスクリーン座標だそうですが。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.drageventargs.aspx
DataGridViewのPointToClientメソッドでDataGridViewのクライアント座標に変換しないといけないのでは。
引用返信 編集キー/
■74144 / inTopicNo.8)  Re[3]: DataGridViewにてD&Dが失敗する
□投稿者/ ヴァン (9回)-(2014/12/03(Wed) 09:42:37)
こんにちは。

No74142 (優希(ゆき) さん) に返信

そもそもドロップされる側のViewにセルは存在しているのでしょうか?
引用返信 編集キー/
■74145 / inTopicNo.9)  Re[4]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (22回)-(2014/12/03(Wed) 09:45:13)
No74143 (Hongliang さん) に返信
>>データとしてはX,Y座標は取得できていますが、
> 本当ですか? DragEventArgsのX, Yはスクリーン座標だそうですが。
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.drageventargs.aspx
> DataGridViewのPointToClientメソッドでDataGridViewのクライアント座標に変換しないといけないのでは。

http://dobon.net/vb/dotnet/datagrid/hittest.html

これはDataGridですが、この方法とは違うのでしょうか?
引用返信 編集キー/
■74146 / inTopicNo.10)  Re[4]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (23回)-(2014/12/03(Wed) 09:46:33)
No74144 (ヴァン さん) に返信
> こんにちは。
>
> ■No74142 (優希(ゆき) さん) に返信
>
> そもそもドロップされる側のViewにセルは存在しているのでしょうか?


セルは存在しています。


引用返信 編集キー/
■74147 / inTopicNo.11)  Re[5]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (24回)-(2014/12/03(Wed) 09:49:12)
2014/12/03(Wed) 10:01:08 編集(投稿者)

回答じゃない事を明記し忘れ
やってることは、D&Dでの座標の取得のこと

自己レスですが、過去ログを見つけたので貼っておきます

http://bbs.wankuma.com/index.cgi?mode=al2&namber=41508&KLOG=71


引用返信 編集キー/
■74148 / inTopicNo.12)  Re[5]: DataGridViewにてD&Dが失敗する
□投稿者/ shu (637回)-(2014/12/03(Wed) 10:05:34)
No74145 (優希(ゆき) さん) に返信
> ■No74143 (Hongliang さん) に返信
> >>データとしてはX,Y座標は取得できていますが、
>>本当ですか? DragEventArgsのX, Yはスクリーン座標だそうですが。
>>http://msdn.microsoft.com/ja-jp/library/system.windows.forms.drageventargs.aspx
>>DataGridViewのPointToClientメソッドでDataGridViewのクライアント座標に変換しないといけないのでは。
> 
> http://dobon.net/vb/dotnet/datagrid/hittest.html
> 
> これはDataGridですが、この方法とは違うのでしょうか?

Hongliang さんの指摘は
 DragEventArgsのX,Y つまり
> Dim hti As DataGridView.HitTestInfo = DirectCast(sender, DataGridView).HitTest(e.X, e.Y)
ここのe.X,e.YがDataGridView上の座標ではなくWindows上でのマウス位置を表していますということです。
なので該当画面の位置、DataGridViewの該当画面上の位置分だけずれてしまいます。

Dim dgv = DirectCast(sender, DataGridView)
Dim dragpt as new Point(e.X,e.Y)
Dim dgvpt = dgv.PointToClient(dragpt)

のような感じで座標変換する必要がるということです。なお上記コードは動作確認はしておりません。


引用返信 編集キー/
■74149 / inTopicNo.13)  Re[6]: DataGridViewにてD&Dが失敗する
□投稿者/ 優希(ゆき) (25回)-(2014/12/03(Wed) 10:33:06)
2014/12/03(Wed) 10:33:51 編集(投稿者)
途中だったのを忘れてたorz

■No74148 (shu さん) に返信
> ■No74145 (優希(ゆき) さん) に返信
>>■No74143 (Hongliang さん) に返信
>>>>データとしてはX,Y座標は取得できていますが、
> >>本当ですか? DragEventArgsのX, Yはスクリーン座標だそうですが。
> >>http://msdn.microsoft.com/ja-jp/library/system.windows.forms.drageventargs.aspx
> >>DataGridViewのPointToClientメソッドでDataGridViewのクライアント座標に変換しないといけないのでは。
>>
>>http://dobon.net/vb/dotnet/datagrid/hittest.html
>>
>>これはDataGridですが、この方法とは違うのでしょうか?
> 
> Hongliang さんの指摘は
>  DragEventArgsのX,Y つまり
>>Dim hti As DataGridView.HitTestInfo = DirectCast(sender, DataGridView).HitTest(e.X, e.Y)
> ここのe.X,e.YがDataGridView上の座標ではなくWindows上でのマウス位置を表していますということです。
> なので該当画面の位置、DataGridViewの該当画面上の位置分だけずれてしまいます。
> 
> Dim dgv = DirectCast(sender, DataGridView)
> Dim dragpt as new Point(e.X,e.Y)
> Dim dgvpt = dgv.PointToClient(dragpt)
> 
> のような感じで座標変換する必要がるということです。なお上記コードは動作確認はしておりません。
> 
> 

shuさんとHongliangの回答を確認して、座標を変換してHitTestで処理した所、うまくD&Dすることが出来ました。

shuさん,ヴァンさん,Hongliang さん

ありがとうございます。

下に、コードを載せておきます(変数は気にしないでください)


            ''スクリーン座標を変数へ入れる
            Dim target As New Point(e.X, e.Y)

            ''スクリーン座標をクライアント座標へ変換
            Dim a = dgvname.PointToClient(target)

            '座標をDataGridViewのHitTestInfoへ入れる
            Dim bbb As DataGridView.HitTestInfo = dgvname.HitTest(a.X, a.Y)

            'ここでドロップしたデータをセルへ入れる
            dgvname(bbb.ColumnIndex, bbb.RowIndex).Value = dgvcellvalue


(英語サイトをスルーしてたけど、C#でまんま答えが載ってた…orz)
http://stackoverflow.com/questions/1835329/how-to-target-a-datagridview-row-or-cell-from-dragdrop-event


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -