トップ回答者
DataGridViewコントロールからPanelコントロールにドラッグ&ドロップできない

質問
-
お世話になります。
先日不可解な現象が発生しましたので皆様のお力を貸していただきたく思います。
Visual Studio 2008にてWindowsフォームアプリケーションプロジェクトでGUIアプリケーションを開発しております。
そのGUIは1つのウィンドウ上にDataGridViewとPanelコントロールを配置しまして、DataGridView上の行をドラッグ&ドロップでPanel上にデータを移動できる機能を実装しております。
そのGUIをお客様が使用中に、Panel上にドラッグしてもマウスポインタが禁止マークのままドロップできないという現象が発生いたしました。
原因について、思い当たるところがPanelコントロールのAllowDropプロパティのFalseからTrueへの戻し忘れでした。
しかし、AllowDropプロパティは一時的にFalseになるタイミングがありますが、ログから上記現象の発生前にTrueになる処理を通っており、さらに、現象発生時にAllowDropをTrueにする処理が走る操作を行っても現象は改善されませんでした。PCの再起動で復旧しております。
PanelコントロールのAllowDropが変更できなくなってしまうような事象があるのでしょうか?
また、マウスポインタの変更についてはPanelコントロールのDragOverイベントで行っていますが、AllowDropがTrueでもDragOverイベントが発生しないことがあるのでしょうか?
どんな些細な情報でもいいのでドラッグ&ドロップできなくなる状況に陥る条件があれば情報提供お願いします。
【動作環境】
OS:Windows XP SP3 Professional
開発環境:VisualStudio2008(.NET Framework Version 3.5 SP1)
開発言語:C++/CLI
回答
-
ちょっと思いつく所だとDragOverイベントでe.Effect = DragDropEffects.Noneにしちゃってるとか?
他だと、GiveFeedbackイベントでアイコンをイメージから生成してたりしてDestroyIconしてないとか?
下のについては、ドラッグ&ドロップ時にイメージからアイコンを生成すると、
APIのDestroyIconで開放しないとメモリリーク起こします。
それ絡みも考えられるかなぁと・・・
すべての返信
-
ちょっと思いつく所だとDragOverイベントでe.Effect = DragDropEffects.Noneにしちゃってるとか?
他だと、GiveFeedbackイベントでアイコンをイメージから生成してたりしてDestroyIconしてないとか?
下のについては、ドラッグ&ドロップ時にイメージからアイコンを生成すると、
APIのDestroyIconで開放しないとメモリリーク起こします。
それ絡みも考えられるかなぁと・・・ -
回答ありがとうございます。
ご指摘の通り、DragOverイベント内に、ドラッグされたオブジェクトによって、e.Effect = DragDropEffects.Noneにするか、e.Effect = DragDropEffects.Copyにするか条件分岐する処理が御座います。
e.Effect = DragDropEffects.Copyになる条件は、
e->Data->GetDataPresent( "自作クラス名"::typeid ) == true
で自作クラスと関連性のないデータは省くような処理になっております。
上記自作クラス名はDataGridViewのDoDragDropで第一引数として渡している変数のクラス名ですので、ドラッグ処理が始まっている以上、GetDataPresentでFalseになる可能性はないと考えているのですが…
GiveFeedbackイベントに関しては使用しておりません。