Extended TreeView and CreateChildControls()

Last post 08-28-2007 9:25 AM by thxmike. 5 replies.

Sort Posts:

  • Extended TreeView and CreateChildControls()

    08-23-2007, 4:42 PM
    • Member
      2 point Member
    • thxmike
    • Member since 09-28-2006, 11:11 AM
    • Posts 6

    I have created a custom Treeview(AdvancedTreeView) that extends the base ASP:Treeview and a custom TreeNode(AdvancedTreeNode) that extends the base ASP:TreeNode. The TreeView has a view properties that I have added such as AlternatingNodeColor.. The TreeNode has a Property which is a ControlCollection that are rendered in the RenderPreText method.

    I add AdvancedTreeNodes dynamically to the AdvancedTreeView and it works pretty well, but I decided to take it a step further. I wanted to add a pager node as the top node for the TreeView to limit the amount of nodes that are displayed due to the amount of html that is returned.

    Since this falls under a composite control I decided to overide the CreateChildControls() method to create new controls such as LinkButtons and Labels to add to a new AdvancedTreeNode. then the PagerNode to the Nodes Collection for the TreeView.

    The first problem I ran into is the CreateChildControls method is never called. So the Node never creates and I end up with a blank node on the screen.

    The second problem I ran into is an event not firing. Since the overriding of the CreateChildControls does not fire I decided to override OnInit Method and call the CreateChildControls method to create my controls and wire up the events. The node creates as expected however when I select one of the linkbuttons the page does a postback but does not call the event method that the linkbutton is wired to.

    I have gone through a series of articles but have not been able to make any headway on this problem. Any assistance to this problem would be greatly appreciated.

  • Re: Extended TreeView and CreateChildControls()

    08-25-2007, 1:10 AM
    • Contributor
      3,121 point Contributor
    • sujitm
    • Member since 05-23-2007, 9:01 AM
    • Pune
    • Posts 512
    1. Try wiring the events in Page_Init handler. You'll have to wire up an event handler to Page Init event for that. Page.Init += new EventHandler...
    2. Try using an image button control instead of label and then you can listen to its events from event bubbling. Remember only Button and ImageButton currently do event bubbling.
    - Sujit

    Dont forget to click "Mark as Answer" on the post that helped you.
    This credits that member, earns you a point and marks your thread as Resolved so we will all know you have been helped.
  • Re: Extended TreeView and CreateChildControls()

    08-27-2007, 6:16 PM
    • Member
      2 point Member
    • thxmike
    • Member since 09-28-2006, 11:11 AM
    • Posts 6

    I am not sure if I follow. I have added the source to the control if you wish to investigate. I have a lot of trial and error in it. My basic problem is I want link buttons to fire the NavigateButtonClick Method. So far I have had no luck.

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Web.UI.WebControls;

    using System.ComponentModel;

    using System.Web.UI;

    namespace Navitas.Web.UI.WebControls.Extended

    {

    public class AdvancedTreeView : TreeView, IPaging, INamingContainer, IPostBackEventHandler

    {

    public AdvancedTreeView() //: base()

    {

    bool myControlIsCreated = this.ChildControlsCreated;

    //NodeCount = this.Nodes.Count;

    //_controls = new ControlCollection(this);

    _navigationTopBarNode = new AdvancedTreeNode(this);

    _navigationBottomBarNode = new AdvancedTreeNode(this);

    //this.ConstructPagingNavigationNode()

    //RefreshButtons();

    //InitializeComponent();

    }

     

    /*private ControlCollection _controls;

    public ControlCollection Controls

    {

    get { return _controls; }

    }*/

    /*private bool _childControlsCreated = false;

    protected override bool ChildControlsCreated

    {

    get { return _childControlsCreated = false; }

    set { _childControlsCreated = value; }

    }*/

    private int _checkboxIndex = 1;

     

     

    private AdvancedTreeNode _navigationTopBarNode;private AdvancedTreeNode NavigationTopBarNode

    {

    get { return _navigationTopBarNode; }

    set { _navigationTopBarNode = value; }

    }

    private AdvancedTreeNode _navigationBottomBarNode;private AdvancedTreeNode NavigationBottomBarNode

    {

    get { return _navigationBottomBarNode; }

    set { _navigationBottomBarNode = value; }

    }

    private string _alternateNodeColor; public string AlternateNodeColor

    {

    get { return _alternateNodeColor; }

    set { _alternateNodeColor = value; }

    }

    private string _alternateBackGroundImage;public string AlternateBackGroundImage

    {

    get { return _alternateBackGroundImage; }

    set { _alternateBackGroundImage = value; }

    }

    private bool _paging;public bool EnablePaging

    {

    get { return _paging; }

    set { _paging = value; }

    }

    //private int _nodeCount;

    public int NodeCount

    {

    get { return this.Nodes.Count; }

    }

    /// <summary>

    /// Since the Nodes TreeNodeCollection is sealed, this is used to extend the Nodes.Add functionality

    /// to allow for node indexing.

    /// </summary>

    /// <param name="node">The Node being added.</param>

    public void AddNode(AdvancedTreeNode node)

    {

    this.Nodes.Add(node);

    //_nodeCount++;

    node.Index = NodeCount;

    }

    public void AddNode(TreeNode node)

    {

    this.Nodes.Add(node);

    //_nodeCount++;

    }

    protected override TreeNode CreateNode()

    {

    AdvancedTreeNode node = new AdvancedTreeNode(this, false);

    //_nodeCount++;

    node.Index = NodeCount;

    return node;

    }

    /// <summary>

    /// Navigation Node Controls

    /// </summary>

    LinkButton btnFirst;

    LinkButton btnPrev;

    LinkButton btnNext;

    LinkButton btnLast;

    Label lblPageNumber;

    Label lblPageCount;

    Label lblof;

    #region IPaging Members

     

    /// <summary>

    /// Move event raised when a move is performed

    /// </summary>

    public event EventHandler Move;

    // variables we use to manage state

    private int _recordsPerPage = 10;

    /// <summary>

    /// Number of records per page

    /// </summary>

    /// <value>The records per page.</value>

    public int RecordsPerPage

    {

    get { return _recordsPerPage; }set { _recordsPerPage = value; }

    }

    /// <summary>

    /// Hide when on single page hides controls when

    /// there is only one page

    /// </summary>

    /// <value><c>true</c> if [hide on single page]; otherwise, <c>false</c>.</value>

    public bool HideOnSinglePage

    {

    get { return Convert.ToBoolean(ViewState["HideOnSinglePage"]); }set { ViewState["HideOnSinglePage"] = value.ToString(); }

    }

    //private int _pageNumber = 1;

    /// <summary>

    /// Current page number

    /// </summary>

    /// <value>The page number.</value>

    public int PageNumber

    {

    get { return Convert.ToInt32(ViewState["PageNumber"]); }set { ViewState["PageNumber"] = value; }

    }

    /// <summary>

    /// Gets or sets a value indicating whether validation is performed when the control buttons are clicked.

    /// </summary>

    /// <value><c>true</c> if [causes validation]; otherwise, <c>false</c>.</value>

    [Description("Gets or sets a value indicating whether validation is performed when the control buttons are clicked.")]public bool CausesValidation

    {

    get

    {

    object causesValidation = ViewState["CausesValidation"];

    if (causesValidation != null)

    return (bool) causesValidation;

    else

    return true;

    }

    set { ViewState["CausesValidation"] = value; }

    }

    /// <summary>

    /// Total Record Count

    /// </summary>

    /// <value>The record count.</value>

    public int RecordCount

    {

    get

    {

    return NodeCount;

    }

    //Convert.ToInt32(ViewState["RecordCount"]); }

    /*set

    {

    ViewState["RecordCount"] = value;

    }*/

    }

    /// <summary>

    /// Total pages count

    /// </summary>

    /// <value>The page count.</value>

    public int PageCount

    {

    get

    {

    // Calculate page count

    int _PageCount = RecordCount/RecordsPerPage;

    // adjust for spillover

    if (RecordCount%RecordsPerPage > 0)

    _PageCount++;

    if (_PageCount < 1)

    _PageCount = 1;

    return _PageCount;

    }

    }

    protected override bool OnBubbleEvent(object source, EventArgs args)

    {

    this.NavigationButtonClick(source, args);return base.OnBubbleEvent(source, args);

    }

     

    /// <summary>

    /// Used by OnMove event

    /// </summary>

    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>

    protected virtual void OnMoveHandler(EventArgs e)

    {

    if (Move != null)

    {

    Move(
    this, e);

    }

    }

    /// <summary>

    /// Enable/disable the nav controls based on the current context, update labels

    /// </summary>

    public void RefreshButtons()

    {

    // enable/disable the nav controls based on the current context

    // we should only show the first button if we're NOT on the first page already

    btnFirst.Enabled = (PageNumber != 1);

    btnPrev.Enabled = (PageNumber > 1);

    btnNext.Enabled = (PageNumber < PageCount);

    btnLast.Enabled = (PageNumber != PageCount);

    //Update labels

    lblPageCount.Text = PageCount.ToString();

    lblPageNumber.Text = PageNumber.ToString();

    if (PageCount <= 1 && HideOnSinglePage)

    {

    btnFirst.Visible =
    false;

    btnPrev.Visible = false;

    btnNext.Visible = false;

    btnLast.Visible = false;

    lblof.Visible = false;

    lblPageCount.Visible = false;

    lblPageNumber.Visible = false;

    }

    else

    {

    btnFirst.Visible =
    true;

    btnPrev.Visible = true;

    btnNext.Visible = true;

    btnLast.Visible = true;

    lblof.Visible = true;

    lblPageCount.Visible = true;

    lblPageNumber.Visible = true;

    }

    }

    /// <summary>

    /// Handles the Load event of the Page control.

    /// </summary>

    /// <param name="sender">The source of the event.</param>

    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>

    /*private void Page_Load(object sender, EventArgs e)

    {

    if (!Page.IsPostBack)

    {

    //this.ConstructPagingNavigationNode();

    }

    }*/

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "Execution")]protected override void CreateChildControls()

    {

    this.Controls.Clear();

    this.ConstructPagingNavigationNode(); base.CreateChildControls();

    }

    /// <summary>

    ///

    /// Main class managing pages

    /// </summary>

    public void ConstructPagingNavigationNode()

    {

    //Construct link button controls

    btnFirst = new LinkButton();

    btnFirst.Width = new Unit("25px");

    btnFirst.ID = "btnFirst";

    btnFirst.Font.Bold = true;

    btnFirst.Text = " |< ";

    btnFirst.CommandArgument = "first";

    btnFirst.Click += new EventHandler(NavigationButtonClick);

    btnFirst.EnableViewState = true;

    //this.Controls.Add(btnFirst);

    NavigationTopBarNode.Controls.Add(btnFirst);

    btnPrev =
    new LinkButton();

    btnPrev.Width = new Unit("25px");

    btnPrev.ID = "btnPrev";

    btnPrev.Font.Bold = true;

    btnPrev.Text = " < ";

    btnPrev.CommandArgument = "prev";

    btnPrev.Click += new EventHandler(NavigationButtonClick);

    btnPrev.EnableViewState = true;

    //this.Controls.Add(btnPrev);

    NavigationTopBarNode.Controls.Add(btnPrev);

    btnNext =
    new LinkButton();

    btnNext.Width = new Unit("25px");

    btnNext.ID = "btnNext";

    btnNext.Font.Bold = true;

    btnNext.Text = " > ";

    btnNext.CommandArgument = "next";

    btnNext.Click += new EventHandler(NavigationButtonClick);

    btnNext.EnableViewState = true;

    //this.Controls.Add(btnNext);

    NavigationTopBarNode.Controls.Add(btnNext);

    btnLast =
    new LinkButton();

    btnLast.Width = new Unit("25px");

    btnLast.ID = "btnLast";

    btnLast.Font.Bold = true;

    btnLast.Text = " >| ";

    btnLast.CommandArgument = "last";

    btnLast.Click += new EventHandler(NavigationButtonClick);

    btnLast.EnableViewState = true;

    //this.Controls.Add(btnLast);

    NavigationTopBarNode.Controls.Add(btnLast);

     

    //Construct Label Controls

    lblPageNumber = new Label();

    lblPageNumber.EnableViewState = true;

    lblPageNumber.ID = "lblPageNumber";

    //this.Controls.Add(lblPageNumber);

    NavigationTopBarNode.Controls.Add(lblPageNumber);

    lblof =
    new Label();

    lblof.EnableViewState = false;

    lblof.ID = "lblOf";

    lblof.Text = "&#160;/&#160;";

    //this.Controls.Add(lblof);

    NavigationTopBarNode.Controls.Add(lblof);

    lblPageCount =
    new Label();

    lblPageCount.EnableViewState = true;

    lblPageCount.ID = "lblPageCount";

    //this.Controls.Add(lblPageCount);

    NavigationTopBarNode.Controls.Add(lblPageCount);

    NavigationTopBarNode.SelectAction =
    TreeNodeSelectAction.None;

    //Set defaults

    if (ViewState["PageNumber"] == null)

    PageNumber = 1;

    /*if (ViewState["RecordCount"] == null)

    RecordCount = 1;*/

    if (ViewState["HideOnSinglePage"] == null)

    HideOnSinglePage = true;

    this.Nodes.AddAt(0, NavigationTopBarNode);

    //Add handlers

    //Load += new EventHandler(Page_Load);

    //_pageNumber.TextChanged += new EventHandler(NavigationTbClick);

     

    /*btnFirst.Command += new CommandEventHandler(NavigationButtonClick);

    btnPrev.Command += new CommandEventHandler(NavigationButtonClick);

    btnNext.Command += new CommandEventHandler(NavigationButtonClick);

    btnLast.Command += new CommandEventHandler(NavigationButtonClick);*/

    }

     

    protected override void OnInit(EventArgs e)

    {

    //ConstructPagingNavigationNode();

    //this.InitializeControls();

    this.EnsureChildControls();base.OnInit(e);

    }

    protected override void EnsureChildControls()

    {

    base.EnsureChildControls();

    }

     

    private void InitializeControls()

    {

    //Add handlers

    //Load += new EventHandler(Page_Load);

    //_pageNumber.TextChanged += new EventHandler(NavigationTbClick);

    /*btnFirst.Click += new EventHandler(NavigationButtonClick);

    btnPrev.Click += new EventHandler(NavigationButtonClick);

    btnNext.Click += new EventHandler(NavigationButtonClick);

    btnLast.Click += new EventHandler(NavigationButtonClick);*/

    }

     

    /// <summary>

    /// Navigations the button click.

    /// </summary>

    /// <param name="sender">The sender.</param>

    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>

    protected virtual void NavigationButtonClick(object sender, EventArgs e)

    {

    // get the command

    string arg = ((LinkButton) sender).CommandArgument;

    // do the command

    switch (arg)

    {

    case ("next"):if (PageNumber < PageCount)

    PageNumber++;

    break;

    case ("prev"):if (PageNumber > 1)

    PageNumber--;

    break;

    case ("last"):

    PageNumber = PageCount;

    break;case ("first"):

    PageNumber = 1;

    break;

    }

    RefreshButtons();

    //Raise the event OnMove

    OnMoveHandler(new EventArgs());

    }

    /// <summary>

    /// Navigations the tb click.

    /// </summary>

    /// <param name="sender">The sender.</param>

    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>

    private void NavigationTbClick(Object sender, EventArgs e)

    {

    int _PageNumber = PageNumber;if (_PageNumber > PageCount)

    {

    PageNumber = PageCount;

    }

    else if (_PageNumber < 1)

    {

    PageNumber = 1;

    }

    else

    {

    PageNumber = _PageNumber;

    }

    RefreshButtons();

    //Raise the event OnMove

    OnMoveHandler(new EventArgs());

    }

    protected override void OnPreRender(EventArgs e)

    {

    //bool myControlIsCreated = this.ChildControlsCreated;

    // this.EnsureChildControls();

    //myControlIsCreated = this.ChildControlsCreated;

    base.OnPreRender(e);

    }

    protected override void Render(HtmlTextWriter writer)

    {

    // Render Navigation Node if enabled

    base.Render(writer);

    }

    /* protected override void RenderContents(HtmlTextWriter writer)

    {

    if ((this.EnablePaging) && (this.Nodes.Count > 0))

    {

    this.RefreshButtons();

    AdvancedTreeNode myNode = (AdvancedTreeNode)this.Nodes[0];

    ((AdvancedTreeNode)this.Nodes[0]).Render(writer);

    }

    if (PageNumber >= 1)

    {

    int beginNode = (PageNumber - 1) * RecordsPerPage;

    int endNode;

    if ((beginNode + RecordsPerPage) > RecordCount)

    {

    endNode = RecordCount;

    }

    else

    {

    endNode = (beginNode + RecordsPerPage);

    }

    for (int i = beginNode; i < endNode; i++)

    {

    AdvancedTreeNode myNode = (AdvancedTreeNode)this.Nodes[i];

    writer.Indent++;

    _checkboxIndex = 1;

    //BuildItem(myNode, writer);

    myNode.Render(writer);

    writer.Indent--;

    writer.WriteLine();

    }

    }

    //base.RenderContents(writer);

    }*/

     

    /*protected override void RenderContents(HtmlTextWriter writer)

    {

    if (Extender.AdapterEnabled)

    {

    TreeView treeView = Control as TreeView;

    if (treeView != null)

    {

    writer.Indent++;

    _checkboxIndex = 1;

    BuildItems(treeView.Nodes, true, true, writer);

    writer.Indent--;

    writer.WriteLine();

    }

    }

    else

    {

    base.RenderContents(writer);

    }

    }*/

     

    protected override object SaveViewState()

    {

    return new Pair(base.SaveViewState(), null);

    }

    protected override void LoadViewState(object state)

    {

    base.LoadViewState(((Pair)state).First);

    //this.EnsureChildControls();

    }

    private void BuildItems(TreeNodeCollection items, bool isRoot, bool isExpanded, HtmlTextWriter writer)

    {

    if (items.Count > 0)

    {

    writer.WriteLine();

    writer.WriteBeginTag(
    "ul");if (!isExpanded)

    {

    writer.WriteAttribute(
    "class", "AspNet-TreeView-Hide");

    }

    writer.Write(
    HtmlTextWriter.TagRightChar);

    writer.Indent++;

    foreach (TreeNode item in items)

    {

    BuildItem(item, writer);

    }

    writer.Indent--;

    writer.WriteLine();

    writer.WriteEndTag(
    "ul");

    }

    }

     

    private void BuildItem(TreeNode item, HtmlTextWriter writer)

    {

    TreeView treeView = this;if ((treeView != null) && (item != null) && (writer != null))

    {

    writer.WriteLine();

    writer.WriteBeginTag(
    "li");

    writer.WriteAttribute("class", GetNodeClass(item));

    writer.Write(HtmlTextWriter.TagRightChar);

    writer.Indent++;

    writer.WriteLine();

    if (IsExpandable(item) && treeView.ShowExpandCollapse)

    {

    WriteNodeExpander(treeView, item, writer);

    }

    if (IsCheckbox(treeView, item))

    {

    WriteNodeCheckbox(treeView, item, writer);

    }

    else if (IsLink(item))

    {

    WriteNodeLink(treeView, item, writer);

    }

    else

    {

    WriteNodePlain(treeView, item, writer);

    }

    if (HasChildren(item))

    {

    BuildItems(item.ChildNodes,
    false, item.Expanded.Equals(true), writer);

    }

    writer.Indent--;

    writer.WriteLine();

    writer.WriteEndTag(
    "li");

    }

    }

    private void WriteNodeExpander(TreeView treeView, TreeNode item, HtmlTextWriter writer)

    {

    writer.WriteBeginTag(
    "span");

    writer.WriteAttribute("class", (item.Expanded.Equals(true) ? "AspNet-TreeView-Collapse" : "AspNet-TreeView-Expand"));

    if (HasChildren(item))

    {

    writer.WriteAttribute(
    "onclick", "ExpandCollapse__AspNetTreeView(this)");

    }

    else

    {

    writer.WriteAttribute(
    "onclick", Page.ClientScript.GetPostBackEventReference(treeView, "p" + (Page.Server.HtmlEncode(item.ValuePath)).Replace("/", "\\"), true));

    }

    writer.Write(
    HtmlTextWriter.TagRightChar);

    writer.Write("&nbsp;");

    writer.WriteEndTag("span");

    writer.WriteLine();

    }

    private void WriteNodeImage(TreeView treeView, TreeNode item, HtmlTextWriter writer)

    {

    string imgSrc = GetImageSrc(treeView, item);if (!String.IsNullOrEmpty(imgSrc))

    {

    writer.WriteBeginTag("img");

    writer.WriteAttribute("src", treeView.ResolveClientUrl(imgSrc));

    writer.WriteAttribute("alt", !String.IsNullOrEmpty(item.ToolTip) ? item.ToolTip : (!String.IsNullOrEmpty(treeView.ToolTip) ? treeView.ToolTip : item.Text));

    writer.Write(HtmlTextWriter.SelfClosingTagEnd);

    }

    }

    private void WriteNodeCheckbox(TreeView treeView, TreeNode item, HtmlTextWriter writer)

    {

    writer.WriteBeginTag(
    "input");

    writer.WriteAttribute("type", "checkbox");

    writer.WriteAttribute("id", treeView.ClientID + "n" + _checkboxIndex.ToString() + "CheckBox");

    writer.WriteAttribute("name", treeView.UniqueID + "n" + _checkboxIndex.ToString() + "CheckBox");

    if (!String.IsNullOrEmpty(treeView.Attributes["OnClientClickedCheckbox"]))

    {

    writer.WriteAttribute(
    "onclick", treeView.Attributes["OnClientClickedCheckbox"]);

    }

    if (item.Checked)

    {

    writer.WriteAttribute(
    "checked", "checked");

    }

    writer.Write(
    HtmlTextWriter.SelfClosingTagEnd);if (!String.IsNullOrEmpty(item.Text))

    {

    writer.WriteLine();

    writer.WriteBeginTag(
    "label");

    writer.WriteAttribute("for", treeView.ClientID + "n" + _checkboxIndex.ToString() + "CheckBox");

    writer.Write(HtmlTextWriter.TagRightChar);

    writer.Write(item.Text);

    writer.WriteEndTag(
    "label");

    }

    _checkboxIndex++;

    }

     

    private void WriteNodeLink(TreeView treeView, TreeNode item, HtmlTextWriter writer)

    {

    writer.WriteBeginTag(
    "a");if (!String.IsNullOrEmpty(item.NavigateUrl))

    {

    writer.WriteAttribute(
    "href", item.NavigateUrl);

    }

    else

    {

    string codePrefix = "";if (item.SelectAction == TreeNodeSelectAction.Select)

    {

    codePrefix =
    "s";

    }

    else if (item.SelectAction == TreeNodeSelectAction.SelectExpand)

    {

    codePrefix =
    "e";

    }

    else if (item.PopulateOnDemand)

    {

    codePrefix =
    "p";

    }

    writer.WriteAttribute(
    "href", Page.ClientScript.GetPostBackClientHyperlink(treeView, codePrefix + (Page.Server.HtmlEncode(item.ValuePath)).Replace("/", "\\"), true));

    }

    //WebControlAdapterExtender.WriteTargetAttribute(writer, item.Target);

    if (!String.IsNullOrEmpty(item.ToolTip))

    {

    writer.WriteAttribute(
    "title", item.ToolTip);

    }

    else if (!String.IsNullOrEmpty(treeView.ToolTip))

    {

    writer.WriteAttribute(
    "title", treeView.ToolTip);

    }

    writer.Write(
    HtmlTextWriter.TagRightChar);

    writer.Indent++;

    writer.WriteLine();

    WriteNodeImage(treeView, item, writer);

    writer.Write(item.Text);

    writer.Indent--;

    writer.WriteEndTag(
    "a");

    }

    private void WriteNodePlain(TreeView treeView, TreeNode item, HtmlTextWriter writer)

    {

    writer.WriteBeginTag(
    "span");if (IsExpandable(item))

    {

    writer.WriteAttribute("class", "AspNet-TreeView-ClickableNonLink");

    if (treeView.ShowExpandCollapse)

    {

    writer.WriteAttribute(
    "onclick", "ExpandCollapse__AspNetTreeView(this.parentNode.getElementsByTagName('span')[0])");

    }

    }

    else

    {

    writer.WriteAttribute(
    "class", "AspNet-TreeView-NonLink");

    }

    writer.Write(
    HtmlTextWriter.TagRightChar);

    writer.Indent++;

    writer.WriteLine();

    WriteNodeImage(treeView, item, writer);

    writer.Write(item.Text);

    writer.Indent--;

    writer.WriteEndTag(
    "span");

    }

    private void UpdateCheckmarks(TreeNodeCollection items)

    {

    TreeView treeView = this;if ((treeView != null) && (items != null))

    {

    foreach (TreeNode item in items)

    {

    if (((item.ShowCheckBox != null) && (item.ShowCheckBox.Value == true)) ||

    (treeView.ShowCheckBoxes == TreeNodeTypes.All) ||

    ((treeView.ShowCheckBoxes == TreeNodeTypes.Leaf) && (!IsExpandable(item))) ||

    ((treeView.ShowCheckBoxes == TreeNodeTypes.Parent) && (IsExpandable(item))) ||((treeView.ShowCheckBoxes == TreeNodeTypes.Root) && (item.Depth == 0)))

    {

    string name = treeView.UniqueID + "n" + _checkboxIndex.ToString() + "CheckBox";

    bool bIsNowChecked = (Page.Request.Form[name] != null);if (item.Checked != bIsNowChecked)

    {

    item.Checked = bIsNowChecked;

    //Extender.RaiseAdaptedEvent("TreeNodeCheckChanged", new TreeNodeEventArgs(item));

    }

    _checkboxIndex++;

    }

    if (HasChildren(item))

    {

    UpdateCheckmarks(item.ChildNodes);

    }

    }

    }

    }

    private string GetNodeClass(TreeNode item)

    {

    string value = "AspNet-TreeView-Leaf";if (item != null)

    {

    if (item.Depth == 0)

    {

    if (IsExpandable(item))

    {

    value =
    "AspNet-TreeView-Root";

    }

    else

    {

    value =
    "AspNet-TreeView-Root AspNet-TreeView-Leaf";

    }

    }

    else if (IsExpandable(item))

    {

    value =
    "AspNet-TreeView-Parent";

    }

    if (item.Selected)

    {

    value +=
    " AspNet-TreeView-Selected";

    }

    else if (IsChildNodeSelected(item))

    {

    value +=
    " AspNet-TreeView-ChildSelected";

    }

    else if (IsParentNodeSelected(item))

    {

    value +=
    " AspNet-TreeView-ParentSelected";

    }

    }

    return value;

    }

    private string GetImageSrc(TreeView treeView, TreeNode item)

    {

    string imgSrc = "";if ((treeView != null) && (item != null))

    {

    imgSrc = item.ImageUrl;

    if (imgSrc.Length == 0)

    {

    if (item.Depth == 0)

    {

    if ((treeView.RootNodeStyle != null) && (treeView.RootNodeStyle.ImageUrl.Length > 0))

    {

    imgSrc = treeView.RootNodeStyle.ImageUrl;

    }

    }

    else

    {

    if (!IsExpandable(item))

    {

    if ((treeView.LeafNodeStyle != null) && (treeView.LeafNodeStyle.ImageUrl.Length > 0))

    {

    imgSrc = treeView.LeafNodeStyle.ImageUrl;

    }

    }

    else if ((treeView.ParentNodeStyle != null) && (treeView.ParentNodeStyle.ImageUrl.Length > 0))

    {

    imgSrc = treeView.ParentNodeStyle.ImageUrl;

    }

    }

    }

    if ((imgSrc.Length == 0) && (treeView.LevelStyles != null) && (treeView.LevelStyles.Count > item.Depth))

    {

    if (treeView.LevelStyles[item.Depth].ImageUrl.Length > 0)

    {

    imgSrc = treeView.LevelStyles[item.Depth].ImageUrl;

    }

    }

    }

    return imgSrc;

    }

    private bool HasChildren(TreeNode item)

    {

    return ((item != null) && ((item.ChildNodes != null) && (item.ChildNodes.Count > 0)));

    }

    private bool IsExpandable(TreeNode item)

    {

    return (HasChildren(item) || ((item != null) && item.PopulateOnDemand));

    }

    private void ClearSelectedNode(TreeNodeCollection nodes)

    {

    if (nodes != null)

    {

    foreach (TreeNode node in nodes)

    {

    if (node.Selected)

    {

    node.Selected =
    false;

    }

    if (node.ChildNodes != null)

    {

    ClearSelectedNode(node.ChildNodes);

    }

    }

    }

    }

    private bool IsChildNodeSelected(TreeNode item)

    {

    bool bRet = false;if ((item != null) && (item.ChildNodes != null))

    {

    bRet = IsChildNodeSelected(item.ChildNodes);

    }

    return bRet;

    }

    private bool IsChildNodeSelected(TreeNodeCollection nodes)

    {

    bool bRet = false;if (nodes != null)

    {

    foreach (TreeNode node in nodes)

    {

    if (node.Selected || IsChildNodeSelected(node.ChildNodes))

    {

    bRet = true;

    break;

    }

    }

    }

    return bRet;

    }

    static public void ExpandToDepth(TreeNodeCollection nodes, int expandDepth)

    {

    if (nodes != null)

    {

    foreach (TreeNode node in nodes)

    {

    if (node.Depth < expandDepth)

    {

    node.Expand();

    ExpandToDepth(node.ChildNodes, expandDepth);

    }

    }

    }

    }

     

    private bool IsParentNodeSelected(TreeNode item)

    {

    bool bRet = false;if ((item != null) && (item.Parent != null))

    {

    if (item.Parent.Selected)

    {

    bRet =
    true;

    }

    else

    {

    bRet = IsParentNodeSelected(item.Parent);

    }

    }

    return bRet;

    }

    private void ExpandToSelectedNode()

    {

    TreeView treeView = this;if ((treeView != null) && (treeView.SelectedNode != null))

    {

    ExpandToNode(treeView.SelectedNode);

    }

    }

    private void ExpandToNode(TreeNode item)

    {

    TreeView treeView = this;if ((treeView != null) && (item != null))

    {

    treeView.CollapseAll();

    TreeNode nodeToExpand = item.Parent;while (nodeToExpand != null)

    {

    nodeToExpand.Expanded =
    true;

    nodeToExpand = nodeToExpand.Parent;

    }

    }

    }

    private bool IsLink(TreeNode item)

    {

    return (item != null) && ((!String.IsNullOrEmpty(item.NavigateUrl)) || (item.SelectAction == TreeNodeSelectAction.Select) || (item.SelectAction == TreeNodeSelectAction.SelectExpand) || (item.PopulateOnDemand && (item.SelectAction != TreeNodeSelectAction.None)));

    }

    private bool IsCheckbox(TreeView treeView, TreeNode item)

    {

    bool bItemCheckBoxDisallowed = (item.ShowCheckBox != null) && (item.ShowCheckBox.Value == false);

    bool bItemCheckBoxWanted = (item.ShowCheckBox != null) && (item.ShowCheckBox.Value == true);

    bool bTreeCheckBoxWanted =

    (treeView.ShowCheckBoxes == TreeNodeTypes.All) ||

    ((treeView.ShowCheckBoxes == TreeNodeTypes.Leaf) && (!IsExpandable(item))) ||

    ((treeView.ShowCheckBoxes == TreeNodeTypes.Parent) && (IsExpandable(item))) ||

    ((treeView.ShowCheckBoxes == TreeNodeTypes.Root) && (item.Depth == 0));return (!bItemCheckBoxDisallowed) && (bItemCheckBoxWanted || bTreeCheckBoxWanted);

    }

    private string ComposeViewState(TreeNodeCollection nodes, string state)

    {

    if (nodes != null)

    {

    foreach (TreeNode node in nodes)

    {

    if (IsExpandable(node))

    {

    if (node.Expanded.Equals(true))

    {

    state +=
    "e";

    state = ComposeViewState(node.ChildNodes, state);

    }

    else

    {

    state +=
    "n";

    }

    }

    }

    }

    return state;

    }

    private string ExpandToState(TreeNodeCollection nodes, string state)

    {

    if ((nodes != null) && (!String.IsNullOrEmpty(state)))

    {

    foreach (TreeNode node in nodes)

    {

    if (IsExpandable(node))

    {

    bool bExpand = (state[0] == 'e');

    state = state.Substring(1);

    if (bExpand)

    {

    node.Expand();

    state = ExpandToState(node.ChildNodes, state);

    }

    }

    }

    }

    return state;

    }

    /*private void RenderPage()

    {

    for (int i = 1; i <= RecordsPerPage; i++)

    {

    //this.Nodes[(RecordCount/RecordsPerPage)*PageNumber].Re

    }

    }

    #endregion

    #region IPostBackEventHandler Members

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)

    {

    OnMoveHandler(new EventArgs());

    }

    */

    #endregion

    }

    }

  • Re: Extended TreeView and CreateChildControls()

    08-28-2007, 4:02 AM

    Hi,

    From your description, CreateChildControls method never called and an event not firing which indicates that the problem is caused by raising custom events from your control. So, could you please following the steps below to check if there's anything wrong in your code.

    First, each custom event should be defined using the standard event pattern.

    Second, An event-handling method should be defined for the custom event of your control.

    Third, the CreateChildControls method creates an instance of an event handler that reference the method mentioned in the second step and attaches the event handler to the custom event of the control instance.

    Thanks.

    Michael Jin.
    Microsoft Online Community Support

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
  • Re: Extended TreeView and CreateChildControls()

    08-28-2007, 8:11 AM
    • Member
      2 point Member
    • thxmike
    • Member since 09-28-2006, 11:11 AM
    • Posts 6

    OK

    This is what I have defined for the first item "First, each custom event should be defined using the standard event pattern."

    public event EventHandler Move;

    protected virtual void OnMoveHandler(EventArgs e)

    {

    if (Move != null)

    {

    Move(
    this, e);

    }

    }

     

    For the second," Second, An event-handling method should be defined for the custom event of your control" I have in the control for the Button click event which calls the onmovehandler in the previous step.

    protected virtual void NavigationButtonClick(object sender, EventArgs e)

    {

    // get the command

    string arg = ((LinkButton) sender).CommandArgument;

    // do the command

    switch (arg)

    {

    case ("next"):if (PageNumber < PageCount)

    PageNumber++;

    break;

    case ("prev"):if (PageNumber > 1)

    PageNumber--;

    break;

    case ("last"):

    PageNumber = PageCount;

    break;case ("first"):

    PageNumber = 1;

    break;

    }

    RefreshButtons();

    //Raise the event OnMove

    OnMoveHandler(new EventArgs());

    }

    On the third item, "Third, the CreateChildControls method creates an instance of an event handler that reference the method mentioned in the second step and attaches the event handler to the custom event of the control instance" Here is my CreateChildControls method which references the method in the second step. You can see the link buttons click event are wired to the event method NavigationButtonClick which calls the event handler OnMoveHandler.

    protected override void CreateChildControls()

    {

    this.Controls.Clear();

    this.ConstructPagingNavigationNode();

    base.CreateChildControls();

    }

    /// <summary>

    ///

    /// Main class managing pages

    /// </summary>

    public void ConstructPagingNavigationNode()

    {

    //Construct link button controls

    btnFirst = new LinkButton();

    btnFirst.Width = new Unit("25px");

    btnFirst.ID = "btnFirst";

    btnFirst.Font.Bold = true;

    btnFirst.Text = " |< ";

    btnFirst.CommandArgument = "first";

    btnFirst.Click += new EventHandler(NavigationButtonClick);

    btnFirst.EnableViewState = true;

    NavigationTopBarNode.Controls.Add(btnFirst);

    btnPrev =
    new LinkButton();

    btnPrev.Width = new Unit("25px");

    btnPrev.ID = "btnPrev";

    btnPrev.Font.Bold = true;

    btnPrev.Text = " < ";

    btnPrev.CommandArgument = "prev";

    btnPrev.Click += new EventHandler(NavigationButtonClick);

    btnPrev.EnableViewState = true;

    NavigationTopBarNode.Controls.Add(btnPrev);

    btnNext =
    new LinkButton();

    btnNext.Width = new Unit("25px");

    btnNext.ID = "btnNext";

    btnNext.Font.Bold = true;

    btnNext.Text = " > ";

    btnNext.CommandArgument = "next";

    btnNext.Click += new EventHandler(NavigationButtonClick);

    btnNext.EnableViewState = true;

    NavigationTopBarNode.Controls.Add(btnNext);

    btnLast =
    new LinkButton();

    btnLast.Width = new Unit("25px");

    btnLast.ID = "btnLast";

    btnLast.Font.Bold = true;

    btnLast.Text = " >| ";

    btnLast.CommandArgument = "last";

    btnLast.Click += new EventHandler(NavigationButtonClick);

    btnLast.EnableViewState = true;

    NavigationTopBarNode.Controls.Add(btnLast);

     

    lblPageNumber = new Label();

    lblPageNumber.EnableViewState = true;

    lblPageNumber.ID = "lblPageNumber";

    NavigationTopBarNode.Controls.Add(lblPageNumber);

    lblof =
    new Label();

    lblof.EnableViewState = false;

    lblof.ID = "lblOf";

    lblof.Text = "&#160;/&#160;";

    NavigationTopBarNode.Controls.Add(lblof);

    lblPageCount =
    new Label();

    lblPageCount.EnableViewState = true;

    lblPageCount.ID = "lblPageCount";

    NavigationTopBarNode.Controls.Add(lblPageCount);

    NavigationTopBarNode.SelectAction =
    TreeNodeSelectAction.None;

    //Set defaults

    if (ViewState["PageNumber"] == null)

    PageNumber = 1;

    if (ViewState["HideOnSinglePage"] == null)

    HideOnSinglePage = true;

    this.Nodes.AddAt(0, NavigationTopBarNode);

    }

     

    Each time I click on any of the link buttons, a post back occurs but the wired event method does not get called.

  • Re: Extended TreeView and CreateChildControls()

    08-28-2007, 9:25 AM
    • Member
      2 point Member
    • thxmike
    • Member since 09-28-2006, 11:11 AM
    • Posts 6

    Based on what I found with some research I have done, it appears the TreeView does not follow the standard event Lifecycle.

    I created a basic composite control extending the control class instead of treeview and everything worked as expected including CreateChildControls() being called before the page is rendered.

    I then changed the control to extend a WebControl and everything worked as expected. 

    However, when I change the composite control to extend a treeview the page never calls the CreateChildControls() method. It appears that the TreeView is unique in its lifecycle? This is frustrating since the TreeView extends from WebControl. As developers, how are we informed when an ASP control follows the standard lifecycle or not?

Page 1 of 1 (6 items)