Skip to main content

TreeView Control With Custom Icons in ASP.Net Using sitemap


TreeView Control With Custom Icons in ASP.Net Using sitemap

Previous post  Load data dynamically on page scroll using jQuery, AJAX, and ASP.NET

Introduction 
 
The TreeView control is capable of many possible appearances, providing flexible image customization as well as properties that specify custom user interface (UI) options.
We can use images with the TreeView control to represent nodes, connecting lines, and the expand and collapse icons and can also use a predefined set of images from the ImageSet property, or use custom images by setting the individual image properties for each of its nodes.
 
Background
 
My Website is also hierarchical in structure so I knew that a TreeView control was required. The problem was, how to show multiple icons in the treeview, where each icon represents a specific type. The icons must also show a tooltip when hovered over to display the full name of the type using the Sitemap with Sitemap Data Source control .
 
SiteMap Menu with Custom icons
 
While binding a  TreeView to a SiteMapDataSource is very easy, it can prove challenging to determine how to extend the site map with custom properties and use these extended properties in a TreeView . This sample shows how to add custom icons to a sitemap-driven menu.

SiteMap allows the addition of custom attributes to your site map nodes. If you're using the XML site map provider, it's as simple as this:

<siteMapNode url="default.aspx" title="Home" description="The home page" imageUrl="home.gif">

Here, imageUrl is a custom property, not defined by the SiteMap infrastructure by default.

The first idea that comes to mind is to use these custom attributes to just replace the automatic bindings you get from binding a TreeView to a SiteMapDataSource with "manual" bindings. This works very well with SiteMapDataSource because it is implemented so that the nodes implement an ICustomTypeDescriptor, so any XML attribute is exposed as a property on the node as far as reflection is concerned. This is a very powerful feature of .NET reflection that gives it some of the qualities of dynamic languages. Unfortunately, SiteMapDataSource does not implement this, nor does Treeview know how to query custom site map attributes. This is an oversight and support for that might be added in future releases.

An easy (although not declarative) way out of this problem is to hook the OnTreeNodeDataBoundevent and to set the custom properties from there as in the following:
protected void TreeView1_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
    // Reference the underlying SiteMapNode object...

    SiteMapNode nodeFromSiteMap = (SiteMapNode)e.Node.DataItem;

   // If we have an imageUrl value, assign it to the TreeView node's ImageUrl property

   if (nodeFromSiteMap["imageUrl"] != null)

   e.Node.ImageUrl = System.IO.Path.Combine("~/Images/", nodeFromSiteMap["imageUrl"]);

}
 
The Tree View Control looks like this:
<asp:TreeView ID="TreeView1" DataSourceID="SiteMapDataSource1"
NodeStyle-CssClass="treeNode" RootNodeStyle-CssClass="rootNode" LeafNodeStyle-CssClass="leafNode"
EnableViewState
="False" runat="server" ImageSet="BulletedList" ShowLines="false"OnTreeNodeDataBound="TreeView1_TreeNodeDataBound">
  <
ParentNodeStyle Font-Bold="False" />
  <
HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" />
  <
SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD"
  HorizontalPadding="0px" VerticalPadding="0px" />
  <
NodeStyle Font-Names="VerdanaFont-Size="8pt" ForeColor="Black"
  HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" />
</
asp:TreeView>
<
asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
The SiteMap structure looks like the following:
 
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="Home" description="Home" roles="*" url="" >
    <siteMapNode url="Admin/Home.aspx" title="Admin HomeimageUrl="Home-icon.png" roles="Admin" />
    <siteMapNode url="Agent/Home.aspx" title="Agent Homeroles="Agent" />
    <siteMapNode title="Services" description="Services" roles="Admin,Agent" imageUrl="customer-service-icon.png">
      <siteMapNode url="Admin/AddUser.aspx" title="Add Userroles="Admin" />
      <siteMapNode url="Admin/DeleteUser.aspx" title="Delete userroles="Admin" />
      <siteMapNode url="Agent/SearchUser.aspx" title="Search Userroles="Agent" />
      <siteMapNode url="Agent/ViewUser.aspx" title="View Userroles="Agent" />
    </siteMapNode>
    <siteMapNode title="UserMangement" description="Services" roles="Admin,Agent">
      <siteMapNode url="Admin/AddUser1.aspx" title="Add Userroles="Admin" />
      <siteMapNode url="Admin/DeleteUser1.aspx" title="Delete userroles="Admin" />
      <siteMapNode url="Agent/SearchUser1.aspx" title="Search Userroles="Agent" />
      <siteMapNode url="Agent/ViewUser1.aspx" title="View Userroles="Agent" />
    </siteMapNode>
    <siteMapNode title="reportsdescription="Services" roles="Admin,Agent">
      <siteMapNode url="Admin/AddUser2.aspx" title="Add Userroles="Admin" />
      <siteMapNode url="Admin/DeleteUser2.aspx" title="Delete userroles="Admin" />
      <siteMapNode url="Agent/SearchUser2.aspx" title="Search Userroles="Agent" />
      <siteMapNode url="Agent/ViewUser2.aspx" title="View Userroles="Agent" />
    </siteMapNode>
  </siteMapNode>
</siteMap>

TreeViewControl
The final output looks as in the previous image.

Comments

Popular posts from this blog

How to hide url parameters in asp.net

There are different ways to Hide the URL in asp.net , you can choose any one from bellow options . Previously I was Explained about the  Difference between Convert.tostring and .tostring() method Example  ,   Reasons to use Twitter Bootstrap , How to Register AJAX toolkit in web.config file in asp.net a) Using Post Method b) Using Of Session . c) URL Encoding & decoding process . d) Using Server.Transfer() instead of Response.Redirect() method (1)Use a form and POST the information. This might require additional code in source pages, but should not require logic changes in the target pages (merely change Request.QueryString to Request.Form). While POST is not impossible to muck with, it's certainly less appealing than playing with QueryString parameters. (2)Use session variables to carry information from page to page. This is likely a more substantial effort compared to (1), because you will need to take session variable checking into account...

ASP.NET Routing

ASP.NET routing enables you to use URLs that do not have to map to specific files in a Web site. Because the URL does not have to map to a file, you can use URLs that are descriptive of the user's action and therefore are more easily understood by users. The ASP.NET MVC framework and ASP.NET Dynamic Data extend routing to provide features that are used only in MVC applications and in Dynamic Data applications. For more information about MVC, see ASP.NET MVC 3 . For more information about Dynamic Data, see ASP.NET Dynamic Data Content Map . In an ASP.NET application that does not use routing, an incoming request for a URL typically maps to a physical file that handles the request, such as an .aspx file. For example, a request for http://server/application/Products.aspx?id=4 maps to a file that is named Products.aspx that contains code and markup for rendering a response to the browser. The Web page uses the query string value of id=4 to determine what type of c...

How to send mail asynchronously in asp.net with MailMessage

With Microsoft.NET Framework 2.0 everything is asynchronous and we can send mail also asynchronously. This features is very useful when you send lots of bulk mails like offers , Discounts , Greetings . You don’t have to wait for response from mail server and you can do other task . By using     SmtpClient . SendAsync Method (MailMessage, Object)    you need to do  System.Net.Mail has also added asynchronous support for sending email. To send asynchronously, you need need to Wire up a SendCompleted event Create the SendCompleted event Call SmtpClient.SendAsync smtpClient.send() will initiate the sending on the main/ui  thread and would block.  smtpClient.SendAsync() will pick a thread from the .NET Thread Pool and execute the method on that thread. So your main UI will not hang or block . Let's create a simple example to send mail. For sending mail asynchronously you need to create a event handler that will notify that mail success...