2012-04-26 16 views
4

各ノードにカスタムプロパティを追加できるように、TreeNodeクラスを拡張する必要があります(WebForms TreeNodeにはTagプロパティが含まれていません)。カスタムTreeView/TreeNodeを作成する

CustomTreeNode selectedNode = (CustomTreeNode)TreeView.SelectedNode; 

CustomTreeNode node = new CustomTreeNode(1, "CustomType");    
treeView.Nodes.Add(node); 

私は、次やっキャスト例外になるだろう:私はCustomTreeNodeを作成して、ツリービューに追加した場合

public class CustomTreeNode : TreeNode 
{ 

    public CustomTreeNode() 
    {    
    } 

    public CustomTreeNode(int nodeId, string nodeType) 
    { 
     NodeId = nodeId; 
     NodeType = nodeType; 
    } 

    public string NodeType { get; set; } 
    public int NodeId { get; set; } 
} 

:これは私のCustomTreeNodeですTreeViewはTreeNodeを返し、CustomTreeNodeは返さないためです。

私はいくつかの読書をして、TreeViewクラスを拡張し、TreeNodeではなくCustomTreeNodeを返すためにCreateNode()メソッドをオーバーライドする必要があるようです。

public class CustomTreeView : TreeView 
{ 
    protected override TreeNode CreateNode() 
    { 
     return new CustomTreeNode(); 
    } 
} 

問題は、しかし、CreateNode()あなたはCustomTreeNodeクラスの空のコンストラクタを呼び出す持っている必要がありますので、任意の引数を取らないです。だから私は、これを作成しました。したがって、上記のCustomTreeNodeを作成したときに、CustomTreeViewから取得すると、空のコンストラクタが値を持たないノードを返すため、nodeIdとnodeTypeの値が失われました。

ご迷惑をおかけして申し訳ございません。

答えて

5

これは私が(専門家、歓迎何かアドバイス)思い付いたものです。コードの後ろにCustomTreeNodeをインスタンス化し、セッターを介してプロパティを設定します。 CustomTreeNodeクラスを変更して、ViewStateの値を保持します。カスタムツリービューのCreateNodeによって返されたノードは、ViewState情報をロードします。

のTreeNodeクラス:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:CustomTreeNode runat=server></{0}:CustomTreeNode>")] 
public class CustomTreeNode : TreeNode 
{ 
    private const int NODE_TYPE = 1; 
    private const int NODE_ID = 2; 

    public string NodeType { get; set; } 
    public int NodeId { get; set; } 

    protected override void LoadViewState(Object savedState) 
    { 
     if (savedState != null) 
     { 
      object[] myState = (object[])savedState; 
      if (myState[0] != null) 
       base.LoadViewState(myState[0]); 
      if (myState[NODE_TYPE] != null) 
       this.NodeType = (string)myState[NODE_TYPE]; 
      if (myState[NODE_ID] != null) 
       this.NodeId = (int)myState[NODE_ID]; 

     } 
    } 

    protected override Object SaveViewState() 
    { 
     object baseState = base.SaveViewState(); 
     object[] allStates = new object[3]; 
     allStates[0] = baseState; 
     allStates[NODE_TYPE] = this.NodeType; 
     allStates[NODE_ID] = this.NodeId; 

     return allStates; 
    } 
} 

のTreeViewクラス:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:CustomTreeView runat=server></{0}:CustomTreeView>")] 
public class CustomTreeView : TreeView 
{ 
    protected override TreeNode CreateNode() 
    { 
     // Tree node will get its members populated with the data from VIEWSTATE 
     return new CustomTreeNode(); 
    } 
} 

シンプル.aspxのファイル(カスタムコントロールは、アセンブリ "foo" と名前空間 "バー" で定義されていると仮定すると:

<%@ Register TagPrefix="customControl" Assembly="Foo" Namespace="Bar" %> 

<customControl:CustomTreeView ID="sampleTree" 
    runat="server" onselectednodechanged="sampleTree_SelectedNodeChanged"></customControl:CustomTreeView> 
<asp:Label ID="lblSelectedNode" runat="server" ></asp:Label> 

分離コード:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      PopulateTree(); 
     } 
    } 

    private void PopulateTree() 
    { 
     sampleTree.Nodes.Clear(); 
     CustomTreeNode root = new CustomTreeNode(); 
     root.Value = "root node"; 

     sampleTree.Nodes.Add(root); 

     // Creating some fake nodes (you would of course be using real data) 
     for (int i = 0; i < 10; i++) 
     { 
      CustomTreeNode child = new CustomTreeNode(); 
      child.NodeId = i;    // Saved in ViewState 
      child.NodeType = "Type " + i; // Saved in ViewState 
      child.Value = child.NodeType; 
      root.ChildNodes.Add(child); 
     } 
    } 

    protected void sampleTree_SelectedNodeChanged(object sender, EventArgs e) 
    { 
     CustomTreeView cTreeView = (CustomTreeView) sender; 
     lblSelectedNode.Text = ((CustomTreeNode)cTreeView.SelectedNode).NodeType; 
    } 
+0

ありがとうございます。それは非常に有益で、知っておくと便利です。それは完璧に働いた。 – pedroAx

+0

@Tungこれは素晴らしい投稿です。同時に、私はこのリンクを読んでいました:http://support.microsoft.com/kb/2527108あなたのソリューションを実装しましたが、このエラーが発生しました: 'エラー6 'System.Web.UI.WebControls'という名前空間に型または名前空間の名前 'CustomTreeView'が存在しません。私はaspxコードで何かを追加する必要がありますか? – Ninita

+1

@Ninita実際にはこの例のバグです。タグ接頭辞は、Page Directiveで登録するものです。あなたのコントロールが名前空間 'Bar'内の' Foo'というアセンブリで定義されている場合、 'Register'ディレクティブで' Assembly = "Foo"と 'Namespace =" Bar "を設定します。私は例を更新しました – Tung

0

あなたはCustomTreeViewクラスでCreateNodeをオーバーロードできます。

​​
+0

私は、TreeNodeにNodeIdとNodeTypeというメンバーがないため、私の解決策が動作しないことが分かりました。 – jahu

+0

あなたはそれが間違っていると思われる場合、あなたの答えを削除してみませんか? – Breeze

関連する問題