<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Custom Server Controls</title><link>http://forums.asp.net/19.aspx</link><description>All about building ASP.NET server controls. &lt;a href="http://aspadvice.com/SignUp/list.aspx?l=12&amp;c=17" target="_blank"&gt;Email List&lt;/a&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Re: Custom TreeNode: how to implement postback?</title><link>http://forums.asp.net/thread/1431438.aspx</link><pubDate>Tue, 17 Oct 2006 14:47:01 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1431438</guid><dc:creator>BCdotNET</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1431438.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1431438</wfw:commentRss><description>&lt;p&gt;Solved it myself by thinking about it in a different light: I now generate the links to the pages in &lt;font size="2"&gt;RenderPreText, and I add a &lt;font color="#008080" size="2"&gt;TreeNodeSelectAction&lt;/font&gt;&lt;font size="2"&gt;.Select to each custom TreeNode -- I also set the &lt;font size="2"&gt;ImageUrl of the TreeNode and when a user clicks on that, I can access the event and do what I need to do. &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;Mind you, I&amp;#39;m a bit baffled that it is so hard to do all this via the TreeView.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;-----------------------------------------------------------------------------&lt;pre class="coloredcode"&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System;
&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;

&lt;span class="kwd"&gt;namespace&lt;/span&gt; MySite
{
	&lt;span class="kwd"&gt;public class&lt;/span&gt; MyTreeView : TreeView
	{
        &lt;span class="kwd"&gt;protected override&lt;/span&gt; TreeNode CreateNode()
        {
            &lt;span class="kwd"&gt;return new&lt;/span&gt; MyTreeNode();
        }
	}
}
&lt;/pre&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;-----------------------------------------------------------------------------&lt;/p&gt;&lt;pre class="coloredcode"&gt;&lt;span class="kwd"&gt;using&lt;/span&gt; System;
&lt;span class="kwd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;

&lt;span class="kwd"&gt;namespace&lt;/span&gt; MySite
{
    &lt;span class="kwd"&gt;public class&lt;/span&gt; MyTreeNode : TreeNode
    {
        &lt;span class="kwd"&gt;private string&lt;/span&gt; NodeText = &lt;span class="kwd"&gt;string&lt;/span&gt;.Empty;
        &lt;span class="kwd"&gt;private string&lt;/span&gt; NodeURL = &lt;span class="kwd"&gt;string&lt;/span&gt;.Empty;

        &lt;span class="kwd"&gt;public&lt;/span&gt; MyTreeNode()
        {
        }

        &lt;span class="kwd"&gt;public&lt;/span&gt; MyTreeNode(&lt;span class="kwd"&gt;string&lt;/span&gt; aText)
        {
            NodeText = aText;
        }

        &lt;span class="kwd"&gt;public&lt;/span&gt; MyTreeNode(&lt;span class="kwd"&gt;string&lt;/span&gt; aText, &lt;span class="kwd"&gt;string&lt;/span&gt; aNavigateUrl,&lt;span class="kwd"&gt;bool&lt;/span&gt; IsFavorite)
        {
            NodeText = aText;
            NodeURL = aNavigateUrl;

            &lt;span class="kwd"&gt;if&lt;/span&gt; (NodeURL != &lt;span class="kwd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; NodeURL != &lt;span class="kwd"&gt;string&lt;/span&gt;.Empty &amp;amp;&amp;amp; NodeURL != &lt;span class="st"&gt;&amp;quot;#&amp;quot;&lt;/span&gt;)
            {
                &lt;span class="kwd"&gt;if&lt;/span&gt; (IsFavorite)
                {
                    &lt;span class="kwd"&gt;this&lt;/span&gt;.ImageUrl = &lt;span class="st"&gt;&amp;quot;~/Images/Remove.gif&amp;quot;&lt;/span&gt;;
                    &lt;span class="kwd"&gt;this&lt;/span&gt;.ImageToolTip = &lt;span class="st"&gt;&amp;quot;remove from favorites&amp;quot;&lt;/span&gt;;
                }
                &lt;span class="kwd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwd"&gt;this&lt;/span&gt;.ImageUrl = &lt;span class="st"&gt;&amp;quot;~/Images/Add.gif&amp;quot;&lt;/span&gt;;
                    &lt;span class="kwd"&gt;this&lt;/span&gt;.ImageToolTip = &lt;span class="st"&gt;&amp;quot;add to favorites&amp;quot;&lt;/span&gt;;

                }
            }
            &lt;span class="kwd"&gt;this&lt;/span&gt;.Text = &lt;span class="kwd"&gt;string&lt;/span&gt;.Empty;
            &lt;span class="kwd"&gt;this&lt;/span&gt;.Value = NodeURL;
            &lt;span class="kwd"&gt;this&lt;/span&gt;.SelectAction = TreeNodeSelectAction.Select;
        }

        &lt;span class="kwd"&gt;protected override void&lt;/span&gt; RenderPreText(HtmlTextWriter writer)
        {
            &lt;span class="kwd"&gt;bool&lt;/span&gt; bShowlink = &lt;span class="kwd"&gt;false&lt;/span&gt;;
            &lt;span class="kwd"&gt;if&lt;/span&gt; (NodeURL != &lt;span class="kwd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; NodeURL != &lt;span class="kwd"&gt;string&lt;/span&gt;.Empty &amp;amp;&amp;amp; NodeURL != &lt;span class="st"&gt;&amp;quot;#&amp;quot;&lt;/span&gt;)
            {
                bShowlink = &lt;span class="kwd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="cmt"&gt;// start span&lt;/span&gt;
            writer.AddAttribute(&lt;span class="st"&gt;&amp;quot;class&amp;quot;&lt;/span&gt;, &lt;span class="st"&gt;&amp;quot;FavoriteURL&amp;quot;&lt;/span&gt;);
            writer.RenderBeginTag((HtmlTextWriterTag.Span));
            &lt;span class="kwd"&gt;if&lt;/span&gt; (bShowlink)
            {
                &lt;span class="cmt"&gt;// start link&lt;/span&gt;
                writer.AddAttribute(&lt;span class="st"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;, NodeURL);
                writer.AddAttribute(&lt;span class="st"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;, &lt;span class="st"&gt;&amp;quot;go to page&amp;quot;&lt;/span&gt;);
                writer.RenderBeginTag(HtmlTextWriterTag.A);
            }
            &lt;span class="cmt"&gt;// write text&lt;/span&gt;
            writer.Write(NodeText);
            &lt;span class="kwd"&gt;if&lt;/span&gt; (bShowlink)
            {
                &lt;span class="cmt"&gt;// finish link&lt;/span&gt;
                writer.RenderEndTag();
            }
            &lt;span class="cmt"&gt;// finish span&lt;/span&gt;
            writer.RenderEndTag();

            &lt;span class="kwd"&gt;base&lt;/span&gt;.RenderPreText(writer);
        }

        &lt;span class="kwd"&gt;protected override object&lt;/span&gt; SaveViewState()
        {
            &lt;span class="kwd"&gt;object&lt;/span&gt;[] arrState = &lt;span class="kwd"&gt;new object&lt;/span&gt;[3];
            arrState[0] = &lt;span class="kwd"&gt;base&lt;/span&gt;.SaveViewState();
            arrState[1] = &lt;span class="kwd"&gt;this&lt;/span&gt;.NodeText;
            arrState[2] = &lt;span class="kwd"&gt;this&lt;/span&gt;.NodeURL;

            &lt;span class="kwd"&gt;return&lt;/span&gt; arrState;
        }

        &lt;span class="kwd"&gt;protected override void&lt;/span&gt; LoadViewState(&lt;span class="kwd"&gt;object&lt;/span&gt; savedState)
        {
            &lt;span class="kwd"&gt;if&lt;/span&gt; (savedState != &lt;span class="kwd"&gt;null&lt;/span&gt;)
            {
                &lt;span class="kwd"&gt;object&lt;/span&gt;[] arrState = savedState &lt;span class="kwd"&gt;as object&lt;/span&gt;[];

                &lt;span class="kwd"&gt;this&lt;/span&gt;.NodeText = (&lt;span class="kwd"&gt;string&lt;/span&gt;)arrState[1];
                &lt;span class="kwd"&gt;this&lt;/span&gt;.NodeURL = (&lt;span class="kwd"&gt;string&lt;/span&gt;)arrState[2];
                &lt;span class="kwd"&gt;base&lt;/span&gt;.LoadViewState(arrState[0]);
            }
        }
    }
}
&lt;/pre&gt;&lt;p&gt;-----------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;the .aspx page (this is&amp;nbsp;just the relevant code, not the complete page):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;lt;%@ Register Assembly=&amp;quot;MySite&amp;quot; Namespace=&amp;quot;MySite&amp;quot; TagPrefix=&amp;quot;My&amp;quot; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;My:MyTreeView ID=&amp;quot;tvNavigation&amp;quot; runat=&amp;quot;server&amp;quot; OnSelectedNodeChanged=&amp;quot;Node_Selected&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------------&lt;/p&gt;&lt;pre class="coloredcode"&gt;&lt;span class="kwd"&gt;namespace&lt;/span&gt; MySite
{
    &lt;span class="kwd"&gt;public&lt;/span&gt; partial &lt;span class="kwd"&gt;class&lt;/span&gt; Explore : Page
    {
        &lt;span class="kwd"&gt;private&lt;/span&gt; Hashtable htFavorites = &lt;span class="kwd"&gt;new&lt;/span&gt; Hashtable();

        &lt;span class="kwd"&gt;protected void&lt;/span&gt; Page_Load(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            &lt;span class="kwd"&gt;foreach&lt;/span&gt; (&lt;span class="kwd"&gt;string&lt;/span&gt; sURL &lt;span class="kwd"&gt;in&lt;/span&gt; Profile.Favorites)
            {
                htFavorites.Add(sURL, &lt;span class="kwd"&gt;true&lt;/span&gt;);
            }
            &lt;span class="kwd"&gt;if&lt;/span&gt; (!IsPostBack)
            {
                FillTree();
            }
        }

        &lt;span class="kwd"&gt;protected void&lt;/span&gt; Node_Selected(&lt;span class="kwd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            MyTreeView oSTV = (MyTreeView)sender;
            &lt;span class="kwd"&gt;string&lt;/span&gt; sSelectedURL = oSTV.SelectedNode.Value;
            &lt;span class="kwd"&gt;if&lt;/span&gt; (htFavorites[sSelectedURL] != &lt;span class="kwd"&gt;null&lt;/span&gt;)
            {
                Profile.Favorites.Remove(sSelectedURL);
                htFavorites.Remove(sSelectedURL);
            }
            &lt;span class="kwd"&gt;else&lt;/span&gt;
            {
                Profile.Favorites.Add(sSelectedURL);
                htFavorites.Add(sSelectedURL, &lt;span class="kwd"&gt;true&lt;/span&gt;);
            }
            FillTree();
        }
        
        &lt;span class="kwd"&gt;private void&lt;/span&gt; FillTree()
        {
            &lt;span class="cmt"&gt;// needed because we rebuild the tree each time&lt;/span&gt;
            tvNavigation.Nodes.Clear();
            
            &lt;span class="cmt"&gt;// ...code to add nodes to the tree...&lt;/span&gt;

            tvNavigation.ExpandAll();
        }
    }
}
&lt;/pre&gt;&amp;nbsp;</description></item><item><title>Custom TreeNode: how to implement postback?</title><link>http://forums.asp.net/thread/1430081.aspx</link><pubDate>Mon, 16 Oct 2006 14:09:42 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1430081</guid><dc:creator>BCdotNET</dc:creator><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1430081.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1430081</wfw:commentRss><description>&lt;p&gt;I use a TreeView to display a sitemap, but I wanted next to every link a small image; when clicked, it&amp;nbsp;would add the link to a list of favorites in the Profile of the site user. &lt;/p&gt;&lt;p&gt;So I made a custom TreeNode, but I cannot figure out how to make the image postback to the page and expose an event that I can capture and use to add the link to the Profile.&lt;/p&gt;&lt;p&gt;Looked around here and via google, but somehow no one ever seems to have done this. Can anyone help out?&lt;/p&gt;</description></item></channel></rss>