2012-04-26 4 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는 CustomTreeNode가 아닌 TreeNode를 반환하기 때문입니다.

일부 읽기가 완료되었으며 TreeView 클래스를 확장하고 TreeNode 대신 CustomTreeNode를 반환하는 CreateNode() 메서드를 재정의해야합니다.

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

문제는, 그러나 CreateNode()는 CustomTreeNode 클래스의 빈 생성자를 호출해야 할 필요가 있으므로, 인수를 고려하지 않습니다이다 : 그래서 나는이를 만들었습니다. 그래서 위의 CustomTreeNode를 만들었을 때, 빈 생성자가 아무 값도없이 노드를 반환하기 때문에 CustomTreeView에서 다시 가져올 때 nodeId와 nodeType 값이 손실되었습니다.

도움을 주시면 감사하겠습니다.

답변

5

이 내가 (전문가, 환영 조언)를 내놓았다 것입니다. 코드 뒤에 CustomTreeNode을 인스턴스화하고 setter를 통해 속성을 설정합니다. 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; 
    } 
} 

트 리뷰 클래스 :

[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 파일 (사용자 지정 컨트롤이 어셈블리 "푸"와 네임 스페이스 "바"에 정의되어 있다고 가정 :

<%@ 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 과부하 수 :

protected CustomTreeNode CreateNode(int nodeId, string nodeType) 
{ 
    TreeNode res = base.CreateNode(); 
    res.NodeId = nodeId; 
    res.NodeType = nodeType; 
    return res; 
} 
+0

나는 TreeNode에 NodeId 및 NodeType 멤버가 없기 때문에 내 솔루션을 사용할 수 없다는 것을 알았습니다. – jahu

+0

틀렸다고 생각하면 왜 답을 삭제하지 않으시겠습니까? – Breeze