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

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

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

Re[5]: 継承TreeNodeのDrag&Drop処理について


(過去ログ 77 を表示中)

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

■45232 / inTopicNo.1)  継承TreeNodeのDrag&Drop処理について
  
□投稿者/ neko (1回)-(2010/01/06(Wed) 20:58:25)

分類:[C#] 

TreeViewのTreeNodeに情報を追加したノードを使用しています。こんな感じです。
public class TreeNodeEx : TreeNode
{
  private bool isFlag;
  // 略(実際はもう少しあります)
} 

それで
http://support.microsoft.com/kb/307968/ja
を参考にドラッグ&ドロップに対応させたのですが、
普通のTreeNodeなら上手くいきましたが上記のTreeNodeExでは
DestinationNode.Nodes.Add()で登録されません。

private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
	TreeNodeEx NewNode;

	if(e.Data.GetDataPresent("Test.TreeNodeEx", false)) {
		Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
		TreeNodeEx DestinationNode = (TreeNodeEx)((TreeView)sender).GetNodeAt(pt);
		NewNode = (TreeNodeEx)e.Data.GetData("Test.TreeNodeEx");
		if(DestinationNode.TreeView != NewNode.TreeView)
		{     
			DestinationNode.Nodes.Add((TreeNodeEx) NewNode.Clone());
			DestinationNode.Expand();
			//Remove Original Node
			NewNode.Remove();
		}
	}
}

こういう使い方はできないものなんでしょうか?


引用返信 編集キー/
■45233 / inTopicNo.2)  Re[1]: 継承TreeNodeのDrag&Drop処理について
□投稿者/ もりお (156回)-(2010/01/06(Wed) 22:21:20)
No45232 (neko さん) に返信

public class TreeNodeEx : TreeNode
{
    public TreeNodeEx(string text)
        : base(text)
    {
    }
}

こんなクラスを作成して試してみました。
newNode.Clone() のところで
System.MissingMethodException: このプロジェクトで、引数なしコンストラクタは定義されていません。
こんな例外が発生していました。
コンストラクタを追加してみたら OK でした。

public class TreeNodeEx : TreeNode
{
    public TreeNodeEx()
        : base()
    {
    }
    
    public TreeNodeEx(string text)
        : base(text)
    {
    }
}

同じ対応で良いかはわかりませんが
なにか例外が発生していないか確認してみてはいかがでしょうか。

try
{
    destinationNode.Nodes.Add((TreeNode)newNode.Clone());
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex);
}

引用返信 編集キー/
■45234 / inTopicNo.3)  Re[2]: 継承TreeNodeのDrag&Drop処理について
□投稿者/ Azulean (494回)-(2010/01/06(Wed) 22:35:03)
TreeNode.Clone は TreeNode のメンバー変数しか面倒を見ません。
自作の TreeNodeEx でメンバーをいくつか持っているのであれば、自分できちんと Clone メソッドをオーバーライドするべきでしょう。
引用返信 編集キー/
■45235 / inTopicNo.4)  Re[3]: 継承TreeNodeのDrag&Drop処理について
□投稿者/ neko (2回)-(2010/01/06(Wed) 22:55:53)
>>もりおさん
返答ありがとうございます。

ちょっと今チェックできないので、明日例外チェックしてみます。

>>Azulean さん
> 自作の TreeNodeEx でメンバーをいくつか持っているのであれば、自分できちんと Clone メソッドをオーバーライドするべきでしょう。

なるほど。確かにそうですね。

ただ、
DestinationNode.Nodes.Add((TreeNodeEx) NewNode.Clone());  // @
を
DestinationNode.Nodes.Add((TreeNodeEx) NewNode);          // A
としても駄目でした。

試しに
TreeNodeEx tne = new TreeNodeEx( "test" );
DestinationNode.Nodes.Add( tne );                         // B
としてみるとノード"test"が追加されたんですが、
BがOKでAが駄目な理由がイマイチわかりません。

引用返信 編集キー/
■45237 / inTopicNo.5)  Re[4]: 継承TreeNodeのDrag&Drop処理について
□投稿者/ Azulean (495回)-(2010/01/07(Thu) 01:26:08)
> BがOKでAが駄目な理由がイマイチわかりません。
Clone じゃなくて、既に追加されているものを追加しようとしたからではないですか?
引用返信 編集キー/
■45276 / inTopicNo.6)  Re[5]: 継承TreeNodeのDrag&Drop処理について
□投稿者/ neko (3回)-(2010/01/07(Thu) 20:27:59)
とりあえずClone()をオーバーライドしてみたらDrag&Dropでも上手くできましたが、
結局TreeViewのメソッドの返り値がTreeNodeのものが多い為に対応が厳しくなりました。

色々調べたところ、TreeNode.Tag に追加データのclassを突っ込むのが一番楽でした。
最初からこうやれば良かったですね、、

C#は手探り状態ですが、理解できると楽しいですね。
返答ありがとうございました。


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -