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

Asp.Net AjaxFileUpload Control With Drag Drop And Progress Bar

This Example explains how to use AjaxFileUpload Control With Drag Drop And Progress Bar Functionality In Asp.Net 2.0 3.5 4.0 C# And VB.NET. Previous Post  I was Explained about the   jQuery - Allow Alphanumeric (Alphabets & Numbers) Characters in Textbox using JavaScript  ,  Fileupload show selected file in label when file selected  ,  Check for file size with JavaScript before uploading  . May 2012 release of AjaxControlToolkit includes a new AjaxFileUpload Control  which supports Multiple File Upload, Progress Bar and Drag And Drop functionality. These new features are supported by Google Chrome version 16+, Firefox 8+ , Safari 5+ and Internet explorer 10 + , IE9 or earlier does not support this feature. To start with it, download and put latest AjaxControlToolkit.dll in Bin folder of application, Place ToolkitScriptManager  and AjaxFileUpload on the page. HTML SOURCE < asp:ToolkitScriptManager I...

View online files using the Google Docs Viewer

Use Google Docs Viewer for Document viewing within Browser I was looking for a way to let users see Microsoft Word Doc or PDF files online while using my application without leaving their browser without downloading files and then opening it to view with Word or PDF viewer . I was looking for some way out either via any PHP or Microsoft.NET libraries, did some googling on that; but later on I just got an idea that google already has all code written for me.. when I have any email attachment in PDF or DOC or DOCX google does it for me ..! Even while searching I can see PDFs by converting them in HTML. So I just googled it up and found that Google already has this ability that we can use Google Docs Viewer without any Google Account Login . YES that's true no Google Account login is required. It's damn simple and easy. Just pass document path as attachment as parameter and we are done. Google Docs Viewer gives us ability to embed PDF, DOC/DOCX, PPT, TIFF:...

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...