Tengo que extender la clase TreeNode tales que puedo agregar propiedades personalizadas para cada nodo (ver como WebForms TreeNode no incluyen la Etiqueta de la propiedad). Así que esta es mi 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; }
}

Si puedo crear un CustomTreeNode y agregarlo a un TreeView:

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

Me permitiría obtener un casting de excepción de la siguiente manera:

CustomTreeNode selectedNode = (CustomTreeNode)TreeView.SelectedNode;

porque TreeView devuelve un TreeNode, no CustomTreeNode.

He hecho un poco de lectura, y parece como si la necesidad de extender la vista en árbol de la clase, y reemplazar el método CreateNode() para devolver CustomTreeNode en lugar de TreeNode. Así que he creado este:

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

El problema es, sin embargo, CreateNode() no lleva argumentos, así que tienes que tener llame al constructor vacío para la CustomTreeNode clase. Así que cuando he creado mi CustomTreeNode anterior, cuando voy a volver de la CustomTreeView, el nodeId y nodeType valores se han perdido debido a que el constructor vacío devuelve un nodo sin ningún tipo de valores.

Cualquier ayuda la agradezco mucho.

OriginalEl autor pedroAx | 2012-04-26

1 Comentario

  1. 5

    Esto es lo que se me ocurrió (expertos, cualquier consejo dio la bienvenida). Crear una instancia de la CustomTreeNodes en el código detrás y establecer las propiedades a través de incubadoras. Modificar su CustomTreeNode clase para conservar los valores en el ViewState. El nodo devuelto por su costumbre de vista de árbol del CreateNode se carga la información de ViewState.

    Clase 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 clase:

    [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();
        }
    }

    Simple .archivo aspx (Suponiendo que el control personalizado se define en una asamblea «Foo» y un espacio de nombres «Bar»:

    <%@ 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>

    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;
        }
    Gracias. Eso es muy útil para saber. Funcionó a la perfección.
    este es un gran post. Al mismo tiempo, leí esto me estaba leyendo en este enlace: support.microsoft.com/kb/2527108. He implementado la solución, pero tengo este error: Error 6 The type or namespace name 'CustomTreeView' does not exist in the namespace 'System.Web.UI.WebControls'. Necesito agregar algo en el código aspx?
    Que en realidad es un error en el ejemplo. El prefijo de etiqueta debe ser uno que se registre a través de una Directiva de Página. Si el control está definido en una asamblea llamada Foo dentro de un espacio de nombres Bar, a continuación, habría que establecer Assembly="Foo" y Namespace="Bar" en el Register directiva. He actualizado el ejemplo

    OriginalEl autor Tung

Dejar respuesta

Please enter your comment!
Please enter your name here