none
DataGridViewコントロールからPanelコントロールにドラッグ&ドロップできない RRS feed

  • 質問

  • お世話になります。

    先日不可解な現象が発生しましたので皆様のお力を貸していただきたく思います。

    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


    2013年10月14日 11:22

回答

  • 恐らくこの

    上記クラス名はDataGridViewのDoDragDropで第一引数として渡している変数のクラス名ですので、ドラッグ処理が始まっている以上、GetDataPresentでFalseになる可能性はないと考えているのですが…

    第一引数がうまく渡らない時があるのではとしか・・・

    これ以上は想像でしかないので、デバッグ実行で再現させられませんか?

    • 回答としてマーク 星 睦美 2013年10月25日 4:57
    2013年10月21日 12:56
  • ちょっと思いつく所だとDragOverイベントでe.Effect = DragDropEffects.Noneにしちゃってるとか?

    他だと、GiveFeedbackイベントでアイコンをイメージから生成してたりしてDestroyIconしてないとか?

    下のについては、ドラッグ&ドロップ時にイメージからアイコンを生成すると、
    APIのDestroyIconで開放しないとメモリリーク起こします。
    それ絡みも考えられるかなぁと・・・

    • 回答の候補に設定 星 睦美 2013年10月23日 1:41
    • 回答としてマーク 星 睦美 2013年10月25日 4:57
    2013年10月15日 0:46

すべての返信

  • ちょっと思いつく所だとDragOverイベントでe.Effect = DragDropEffects.Noneにしちゃってるとか?

    他だと、GiveFeedbackイベントでアイコンをイメージから生成してたりしてDestroyIconしてないとか?

    下のについては、ドラッグ&ドロップ時にイメージからアイコンを生成すると、
    APIのDestroyIconで開放しないとメモリリーク起こします。
    それ絡みも考えられるかなぁと・・・

    • 回答の候補に設定 星 睦美 2013年10月23日 1:41
    • 回答としてマーク 星 睦美 2013年10月25日 4:57
    2013年10月15日 0:46
  • 回答ありがとうございます。

    ご指摘の通り、DragOverイベント内に、ドラッグされたオブジェクトによって、e.Effect = DragDropEffects.Noneにするか、e.Effect = DragDropEffects.Copyにするか条件分岐する処理が御座います。

    e.Effect = DragDropEffects.Copyになる条件は、

    e->Data->GetDataPresent( "自作クラス名"::typeid ) == true

    で自作クラスと関連性のないデータは省くような処理になっております。

    上記自作クラス名はDataGridViewのDoDragDropで第一引数として渡している変数のクラス名ですので、ドラッグ処理が始まっている以上、GetDataPresentでFalseになる可能性はないと考えているのですが…

    GiveFeedbackイベントに関しては使用しておりません。

    2013年10月20日 10:52
  • 恐らくこの

    上記クラス名はDataGridViewのDoDragDropで第一引数として渡している変数のクラス名ですので、ドラッグ処理が始まっている以上、GetDataPresentでFalseになる可能性はないと考えているのですが…

    第一引数がうまく渡らない時があるのではとしか・・・

    これ以上は想像でしかないので、デバッグ実行で再現させられませんか?

    • 回答としてマーク 星 睦美 2013年10月25日 4:57
    2013年10月21日 12:56
  • 現象が再現しないため、e->Data->GetFormatsにてドラッグでつかんでいるデータの型を動作ログに出すようにし、再現待ちで様子をみたいと思います。

    貴重なご意見ありがとうございました。

    2013年10月25日 2:24
  • フォーラム オペレーターの星 睦美です。
    にくきう さん、返信ありがとうございます。

    今回はaviator_ さんの返信からトラブルシューティングのヒントを得られたと思います。
    同様の問題で情報を探す方にも参考になるよう、私のほうでスレッドに[回答としてマーク]をさせていただきました。

    それでは、これからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年10月25日 4:56