none
typeof()に関して RRS feed

  • 質問

  • typeof()に関して質問させて頂きます。

    TreeViewコントロールに登録するノードに数種類のノードがあり、

    public NODE_A : TreeNode{}
    public NODE_B : TreeNode{}
    public NODE_C : TreeNode{}

    のようにTreeNodeを継承した新しいノードクラスを作りました。

    しかし、ドラッグ&ドロップ処理の

    private void DragEnter( object sender, DragEventArgs e )
    {
      if( e.Data.GetDataPresent( typeof(TreeNode) ) )  e.Effect = DragDropEffects.Move;
      else                                                                   e.Effect = DragDropEffects.None;
    }

    のtypeof(TreeNode)で必ず失敗するようになってしまいました。
    根本的に考えている事が間違っているのかもしれませんが
    typeof(TreeNode)はTreeNodeから継承したクラスでもNGになるのでしょうか?

    2009年10月7日 8:27

回答

  • データを設定するときの話です。DoDragDrop の呼び出し時ですね。
    設定時のを私の前のレスで書いたように変更すれば、DragEnter や DragDrop の時のコードの変更は不要でしょう。

    と書いてから思い出しました。
    DoDragDrop には IDataObject じゃなくても渡せるんでしたっけ。
    DoDragDrop 時に、DataObject を new し、その DataObject に SetData で TreeNode を追加しておきます。
    で、DoDragDrop にはこの DataObject を渡すようにしてください。
    • 回答としてマーク WORST_7 2009年10月7日 12:33
    2009年10月7日 9:49

すべての返信

  • GetFormats を呼び出せば分かりますが、形式として型名が使用されます。識別子が型名だけのため、継承関係のことは DataObject は把握できません。
    DataObject.SetData(Object) の代わりに、DataObject.SetData(Type, Object) を使用することによって識別子に使用する型名と実際に追加するインスタンスを別のものにすることができます。この Type に typeof(TreeNode) を渡せばいいでしょう。
    2009年10月7日 8:48
  • e.Data.GetDataPresent
    ではなく
    e.DataObject.SetData
    ですか?

    private void DragEnter( object sender, DragEventArgs e )
    {
      if( e.Data.GetDataPresent( typeof(TreeNode) ) )  e.Effect = DragDropEffects.Move;
      else                                                                   e.Effect = DragDropEffects.None;
    }

    の例ですとどうなりますでしょうか?
    2009年10月7日 9:25
  • データを設定するときの話です。DoDragDrop の呼び出し時ですね。
    設定時のを私の前のレスで書いたように変更すれば、DragEnter や DragDrop の時のコードの変更は不要でしょう。

    と書いてから思い出しました。
    DoDragDrop には IDataObject じゃなくても渡せるんでしたっけ。
    DoDragDrop 時に、DataObject を new し、その DataObject に SetData で TreeNode を追加しておきます。
    で、DoDragDrop にはこの DataObject を渡すようにしてください。
    • 回答としてマーク WORST_7 2009年10月7日 12:33
    2009年10月7日 9:49
  • 以下のようにして旨くいきました。

    ・・・問題ないかな?



    private void ItemDrag( object sender, ItemDragEventArgs e )
    {
        TreeNode treenode = e.Item as TreeNode;
        
        if( treenode != null )
        {
            if( treenode.Parent == null )
                return;
            
        DataObject dataobject = new DataObject();
        dataobject.SetData( typeof(TreeNode), e.Item );
           
        this.DoDragDrop( dataobject, DragDropEffects.All );
        }
    }

    2009年10月7日 9:58