Creazione di TreeView / TreeNode personalizzati

Ho bisogno di estendere la class TreeNode in modo tale da poter aggiungere proprietà personalizzate a ciascun nodo (visto che WebNorm TreeNode non include la proprietà Tag). Quindi questo è il mio 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; } } 

Se creo un CustomTreeNode e lo aggiungo a un TreeView:

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

Vorrei quindi ottenere un’eccezione di trasmissione facendo quanto segue:

 CustomTreeNode selectedNode = (CustomTreeNode)TreeView.SelectedNode; 

perché TreeView restituisce un TreeNode, non un CustomTreeNode.

Ho letto alcune letture e sembra che sia necessario estendere la class TreeView e sovrascrivere il metodo CreateNode () per restituire CustomTreeNode anziché TreeNode. Così ho creato questo:

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

Il problema è, tuttavia, CreateNode () non accetta argomenti, quindi è necessario chiamare il costruttore vuoto per la class CustomTreeNode. Quindi, quando ho creato il mio CustomTreeNode sopra, quando torno da CustomTreeView, i valori nodeId e nodeType sono stati persi perché il costruttore vuoto restituisce un nodo senza valori.

Qualsiasi aiuto molto apprezzato.

Questo è quello che mi è venuto in mente (esperti, ogni consiglio è ben accetto). CustomTreeNode nel tuo codice e imposta le proprietà tramite setter. Modifica la tua class CustomTreeNode per mantenere i valori in ViewState. Il nodo restituito dal CreateNode della vista ad albero personalizzata caricherà le informazioni di ViewState.

Classe TreeNode:

 [DefaultProperty("Text")] [ToolboxData("<{0}:CustomTreeNode runat=server>")] 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; } } 

Classe TreeView:

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

Semplice file .aspx (supponendo che il controllo personalizzato sia definito in un assieme “Foo” e uno spazio dei nomi “Barra”:

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

CodeBehind:

  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; }