01 February 2012

ASP.NET 3.5 Chart Control

Microsoft recently released a cool new ASP.NET server control - <asp:chart /> - that can be used for free with ASP.NET 3.5 to enable rich browser-based charting scenarios:

Important download links:
Samples to get your development started are available on MSDN (http://code.msdn.microsoft.com/mschart).  Furthermore, if you have questions or suggestions, or just want to share your excitement, please visit our newly created MSDN forum for Windows Forms and ASP.NET Chart Controls.

<asp:chart /> supports a rich assortment of chart options - including pie, area, range, point, circular, accumulation, data distribution, ajax interactive, doughnut, and more. You can statically declare chart data within the control declaration, or alternatively use data-binding to populate it dynamically. At runtime the server control generates an image (for example a .PNG file) that is referenced from the client HTML of the page using a <img/> element output by the <asp:chart/> control. The server control supports the ability to cache the chart image, as well as save it on disk for persistent scenarios. It does not require any other server software to be installed, and will work with any standard ASP.NET page.

Implement the Control Into Your Page
Once installed the <asp:chart/> control shows up under the "Data" tab on the Toolbox, and can be easily declared on any ASP.NET page as a standard server control: but if you are using Visual Web Developer Express, you will need to add it manually. This can be done by right-clicking on the Data section header, and choosing Add Items. as show below.
From there, select the System.Web.UI.DataVisualization.Charting flavour of Chart, and click OK.
That's it. The Chart icon should appear in your toolbox, ready to be dragged onto the Forms Designer. Once you do, you are presented with a default vertical bar chart.

If you drag the chart control into the design-surface, Visual Studio adds some settings to the web.config. This will be done automatically so the following is just an explanation of the changes:

Web.config Changes
 

1)  ChartImage Settings
At the node <appSettings>, the following entry will be created:

<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
This is the configuration of the temporary storage, where the generated files should be placed at. Please be aware of the fact that the storage will use a large amount of space, depending on how many charts
will be generated.
2)  ChartImage.axd Handler
At <system.web><httpHandlers>, the following entry will be added:

<add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" validate="false" />

The chartimage.axd is the main-component of the chart-control. The handler will be called for each generated image.
3)  Control-definition
In the node <system.web><pages><controls>, the tag-definition will be added:

<add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting" assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture:neutral, PublicKeyToken=31bf3856ad364e35" />

This will add the tag-support, that we can use a <asp:chart /> tag in our aspx pages.
4)  Reference to the DataVisualization Assembly
At the end, a reference to the DataVisualization assembly will be added at <system.web><compilation><assemblies>:
<add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture:neutral, PublicKeyToken=31bf3856ad364e35"/>

Default Chart-element in aspx Page
In the aspx page, where you dragged the control in, Visual Studio will add the default chart-control to the code:
<asp:Chart ID="Chart1" runat="server"> 
         <Series> 
                  <asp:Series Name="Series1"></asp:Series> 
         </Series>
         <ChartAreas>
                 <asp:ChartArea Name="ChartArea1"> </asp:ChartArea> 
         </ChartAreas> 
</asp:Chart>

Charting Quickstart
Before we begin using the chart control, I would like to explain the properties "Series" and "ChartAreas":

Series :
The Series collection contains the data-points for one or more data-series. Basically for each line in the chart (consisting of multiple data-points), one series of data is required.
Each series can have its own ChartType. Additionally, each series can be assigned to any ChartArea where each series can also have its own rendering-properties (for example colors, labels, etc.).

ChartAreas :
The ChartArea collection can have one or more configurations which controls the rendering of a chart.
Important: There must be at least one ChartArea definition that the rendering will be executed!

Now we know that we have to add a <asp:Series> in the property <series><asp:ChartArea> at the <ChartAreas> defined, otherwise we would get just a white picture. which contains our datapoints. Also we have to be sure that there is at least one
After changing the chart-control code to the following:

<asp:Chart ID="cTestChart" runat="server">
         <Series>
                 <asp:Series Name="Testing" YValueType="Int32">
                           <Points> 
                                  <asp:DataPoint AxisLabel="Test 1" YValues="10" /> 
                                  <asp:DataPoint AxisLabel="Test 2" YValues="20" /> 
                                 <asp:DataPoint AxisLabel="Test 3" YValues="30" />
                                 <asp:DataPoint AxisLabel="Test 4" YValues="40" /> 
                         </Points> 
               </asp:Series>
          </Series>
         <ChartAreas> 
               <asp:ChartArea Name="ChartArea1">  </asp:ChartArea> 
        </ChartAreas> 
</asp:Chart>

We will get this output in the rendered output page:

So we successfully created our first chart!


Deploying MS Chart Controls:(Production Server)
"MSChart.exe" setup should be used to deploy Microsoft Chart controls and
Changes needed  in the web.config as shown below.

From

<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
To
<add key="ChartImageHandler" value="storage=file;timeout=20;" />

Reference Links : http://www.4guysfromrolla.com/articles/072209-1.aspx



19 January 2012

reCAPTCHA : Free Captcha service for ASP.NET

What is reCaptcha?
  1. reCAPTCHA is a free CAPTCHA service that helps to digitize books, newspapers and old time radio shows.
  2. It’s Free! Yep, reCAPTCHA is free.
  3. It’s Easy. reCAPTCHA is a Web service. As such, adopting it is as simple as adding
    a few lines of code on your site.
  4. It’s Accessible. reCAPTCHA has an audio test that allows blind people to freely
    navigate your site.
  5. It’s Secure. Most other CAPTCHA implementations can be easily broken.
  6. It’s Popular. Over 100,000 sites use reCAPTCHA, including household names like Facebook, Ticketmaster, and Craigslist.
  7. Whenever uses input data in reCaptcha control, they actually help digitizing books.
Moreover is very easy to integrate reCaptcha in our websites. Below are the steps
which are required to integrate it into a ASP.NET page.
Steps to Integrate reCaptcha in ASP.NET 

Step1:  Register for a reCaptcha key : As a first step we need to register for recaptcha keys. Navigate to Get reCaptcha URL to signup for the keys. After we register for the keys, we get a public and private keys which we need to use in our asp.net page. By default all keys work on localhost as well. 

Step2:  Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project. 
Step3:  Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:
Step4:  At the top of the aspx page, insert this: 
      <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>

Step5:  Then insert the reCAPTCHA control inside of the form tag and Enter your Publickey and PrivateKey
 <recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="Red" PublicKey="" PrivateKey="" Height="30px" />
Step6:  Make sure you use ASP.NET validation to validate your form (you should check Page.IsValid on submission)
As an example I created a ASP.NET page whose markup and code behind code looks as given below:
Markup: (.aspx)


<asp:Label  Visible="true" ID="lblResult" runat="server" />
<recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="Red" PublicKey="" PrivateKey="" Height="30px" />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />

Code-behind(.aspx.cs)


protected void  btnSubmit_Click(object sender, EventArgs e)
    {
        recaptcha.Validate();
        if (recaptcha.IsValid)
        {
              if (Page.IsValid)
             {
                   lblResult.Text = "Captcha sucessfull!";
                   lblResult.ForeColor = System.Drawing.Color.Green;
             }
             else
            {
                 lblResult.Text = "Incorrect";
                 lblResult.ForeColor = System.Drawing.Color.Red;
             }
         }
    }

When I entered correct captcha text and pressed submit button following was the output:
 When I entered incorrect captcha text and pressed submit button following was the output:







  1. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  2. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:













  3. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  4. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  5. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  6. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  7. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  8. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  9. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  10. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:












  11. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  12. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:







  13. Read more: http://www.techartifact.com/blogs/2011/01/recaptcha-free-captcha-service-for-asp-net.html#ixzz1jsTc1Pwi




  14. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  15. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:






  16. 18 January 2012

    Steps for Session InProc Mode to Session StateServer

    Many articles are discussing about advantages of using Session StateServer or SQLServer over InProc Mode.  One basic reason why I choose StateServer Mode is when your website is running on Third Party Hosting than you will notice that Session Timeout can occur anytime depends on load of traffic on your server.

    If your website has large number of visitors and session timeout can cause problem, It is better to change Session Mode Session="InProc" to Session="StateServer".

    Main Advantage of Session StateServer (Best to choose while hosting on third party server)
    1.  Session is persistent and reliable.
    2. Avoid Session Timeout due to Memory shortage on server (IIS Setting).

    Main Disadvantage
    1. Poor Performance compare to Session="InProc"
    2. Session_End Event would not fire.

    Now lets understand 
    Steps for changing Session InProc Mode to Session StateServer Mode.

    Step 1:  Start Asp.net State Servcie
    1. Go to Control Panel > Administrative Tools > Services 
    2. Select Asp.Net State Service.
    3. Right Click on Asp.net State Service and choose start from popup menu.
     
    If you forget to Start Service you will receive following error.

    Server Error in '/' Application.

    Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same.  If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection.  If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same.  If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection.  If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.



    Step 2:  Change Session Mode in Web.Config File
    <sessionState mode="StateServer"
                stateConnectionString="tcpip=127.0.0.1:42424"
                cookieless="false"
                timeout="120"/>
    Note: You can adjust timeout minutes based on your requirement.  Let the tcpip server to be localhost i.e. 127.0.0.1.  Most webhosting company uses these settings unless you have different IP for StateServer and  You are not required to change Port Number.


    Step 3: Make All Object Serializable
    You should make all object in your website to serializable.
    Note: To take advantage of Session StateServer or SQLServer or Custom Mode, object needs to be serialized.

    Example:  If your project contains class files for creating DAL (Data Access Layer), you should append Serializable to every class definition in order to make class Serializable.
     
    [Serializable]
    Class Department
    {
            long   _deptId;
            string _deptName;
            
            public long DeptId
            {
                   get {   return _deptId; }
                   set {  _deptId = value; }                  
             }

            public string DeptName
            {
                   get {   return _deptName; }
                   set {  _deptName = value; }                  
             }
    }

    IMPORTANT While doing Serialization
    Remember SQLConnection cannot be serialized.

    You might receive following error if you don't handle this situation.

    Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.


    So to handle this situation you need to do following thing.

    1. Mark SQLConnection Object as NonSerialized
    [NonSerialized] protected SqlConnection _mainConnection;

    2. Mark your Class as Serializable and derive from IDeserializationCallback
    Example:
    [Serializable]
    Class Department: IDeserializationCallback
    {
            long   _deptId;
            string _deptName;
            
            public long DeptId
            {
                   get {   return _deptId; }
                   set {  _deptId = value; }                  
             }

            public string DeptName
            {
                   get {   return _deptName; }
                   set {  _deptName = value; }                  
             }

            //Create this Method Inside your Class
           void IDeserializationCallback.OnDeserialization(object sender)
            {
                //Recreate your connection here
                _mainConnection = new SqlConnection();
                _mainConnection.ConnectionString =
                        ConfigurationSettings.AppSettings["connStr"].ToString();           
            }
    }
     
    Reference Link: Click Here

    DataView.Table - Problem to Persist Sort or Filter View

    I was trying to Sort data with DataView and was trying to convert Dataview to table. I have notice even though view is sorted, when you try to convert it to table it would return only default sort.

    Example:
    //I was trying to perform something as following
    DataTable dtGrid = GetData();
    DataView dvSort = new DataView(dtGrid);
    dvSort.Sort = "CreationDate DESC";
    dtGrid = dvSort.Table; //Will Not Persist Sort Order

    In above example even though view is in sorted order, when i tried to convert it to table it would return only default view. In order to get Sorted view (Persist Sort order) instead of using DataView.Table you should use DataView.ToTable() method

    So if you changed above code with following it would start working as expected.

    DataTable dtGrid = GetData();
    DataView dvSort = new DataView(dtGrid);
    dvSort.Sort = "CreationDate DESC";
    dtGrid = dvSort.ToTable(); //Persist Sort Order

    Copy of Session Object

    Many times we try to make copy of session object, but in case when we are modifying copied object we might noticed that session object gets updated automatically, the reason is both copied object and session object are pointing to same location, even if you tried to use "new" operator while creating object.

    Scenario
    Let say you have Member Class as mentioned under
    public class Member
    {
            public string FirstName { get; set; }
            public string LastName { get; set; }
    }


    Problem:
    Member objMember = new Member();
    objMember.FirstName = "Sachin";
    objMember.LastName = "Tendulkar";

    Then try to save object in Session
    Session["MemberObj"] = objMember;

    This method will work good till we are just accessing object from session, but in case if we try to update object created from session it will update value of session also. That is,

    Member newMember = new Member(); //Even though object is created using "new" keyword.
    newMember = (Member) Session["MemberObj"];
    newMember.FirstName = "Kapil"; //This will update session FirstName also.

    Solution:
    To make copies of session you need to create a clone method in class. In above class create a method clone, to support copy of session.

    public class Member
    {
    public string FirstName { get; set; }
            public string LastName { get; set; }

    public Member clone()
         {
                Member cloneMember = new Member();
                 cloneMember.FirstName = this.FirstName;
                cloneMember.LastName = this.LastName;
    }
    }

    Now, while accessing session object, you can call clone method to make copy of session.

    Member newMember = new Member();
    newMember = ((Member) Session["MemberObj"]).clone();

    now if you try to modify object copied from session, will not update session object.
    newMember.FirstName = "Kapil"; //Will not update session FirstName

    Reference Link: Clickhere

    13 January 2012

    Extension Methods in C-Sharp

    You want to improve the syntax for calling common methods in your C# program, so that function names are shorter and easier to type. Extension methods provide a way to easily represent static methods as instance methods in the syntax of the C# language, which can be more intuitive and recallable for developers. Here we look at extension methods.


    Example

    Here is a custom extension method defined in a program written in the C# programming language. Generally, you will want to store your extension method class in a separate source file, such as "ExtensionMethods.cs" in your project. The file should store a static class with public static extension methods. In the rest of your source code, you can invoke these extension methods in the same way as you can call instance methods.
    Program that uses extension method on string [C#]
    
    using System;
    
    public static class ExtensionMethods
    {
        public static string UppercaseFirstLetter(this string value)
        {
     //
     // Uppercase the first letter in the string this extension is called on.
     //
     if (value.Length > 0)
     {
         char[] array = value.ToCharArray();
         array[0] = char.ToUpper(array[0]);
         return new string(array);
     }
     return value;
        }
    }
    
    class Program
    {
        static void Main()
        {
     //
     // Use the string extension method on this value.
     //
     string value = "dot net perls";
     value = value.UppercaseFirstLetter(); // Called like an instance method.
     Console.WriteLine(value);
        }
    }
    
    Output
    
    Dot net perls
     
    Description. In the first part of the program text, you can see an extension method declaration in the C# programming language. An extension method must be static and can be public so you can use it anywhere in your source code.
    The extension method is called like an instance method, but is actually a static method. The instance pointer 'this' is received as a parameter. You must specify the 'this' keyword before the appropriate parameter you want the method to be called upon. In the method, you can refer to this parameter by its declared name.

    This-keyword in parameter list. The only difference in the declaration between a regular static method and an extension method is the 'this' keyword in the parameter list. If you want the extension method to received other parameters as well, you can place those in the method signature's parameter list after the 'this' parameter.
    Calling extension method. You can call an extension method in the same way you call an instance method. In Visual Studio, an extension method in IntelliSense is represented by a different icon that has a downward arrow on it. You can use this icon to differentiate between instance and extension methods before calling them. Also the text "(extension)" is used in IntelliSense.
     

    What’s the Specification of an Extension Method?

    An extension method is a special kind of static method that allows you to add new methods to existing types without creating derived types. The extension methods are called as if they were instance methods from the extended type, For example: x is an object from int class and we called it as an instance method in int class.

    How to Create my Extension Method?

    Simply, you create your own static method in your class and put this keyword in front of the first parameter in this method (the type that will be extended).

    General Tips in Extension Methods Usage

    This section is optional reading section for understanding the core idea of extension methods:
    1. This keyword has to be the first parameter in the extension method parameter list.
    2. Extension methods are used extensively in C# 3.0 and further version specially for LINQ extensions in C#, for example:
    3. It is important to note that extension methods can't access the private methods in the extended type.
    4. If you want to add new methods to a type, you don't have the source code for it, the ideal solution is to use and implement extension methods of that type.
    5. If you create extension methods that have the same signature methods inside the type you are extending, then the extension methods will never be called.

     

    23 December 2011

    ASP.NET AJAX Calendar Extender – Tips and Tricks

    The CalendarExtender is an ASP.NET AJAX control that is associated with a TextBox control. When the user clicks on the TextBox, a client-side Calendar control pops up. The user can then set a date by clicking on a day, navigate months by clicking on the left and right arrow and perform other such actions without a postback. In this article, we will see some tips and tricks that can be applied to a CalendarExtender control. 

    If you are new to the CalendarExtender control, you can check out some information about it over here.


    I assume you have some basic experience developing ASP.NET Ajax applications and have installed the ASP.NET Ajax Library and ASP.NET Control Toolkit. As of this writing, the toolkit version is Version 1.0.20229 (if you are targeting Framework 2.0, ASP.NET AJAX 1.0 and Visual Studio 2005) and Version 3.0.20229 (if targeting .NET Framework 3.5 and Visual Studio 2008).
    All the tips shown below have been created using Version 3.0.20229 (targeting .NET Framework 3.5 and Visual Studio 2008).
    Tip 1: How to display and hide a Calendar on the click of a Button
    If you want to popup a Calendar on the click of a button, you can use set the PopupButtonID of the CalendarExtender to the ID of the button. In this case, we will be using an ImageButton as shown below:
           <asp:ImageButton runat="Server" ID="ImageButton1" ImageUrl="~/Images/Icon1.jpg" AlternateText="Click here to display calendar" />
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
           
            <cc1:CalendarExtender ID="CalendarExtender1" runat="server"
            TargetControlID="TextBox1" PopupButtonID="ImageButton1"/>
    If you are using an earlier version of the toolkit, you may observe that the ImageButton causes a postback when you click on it again, to close the Calendar. To avoid the postback, use a HTML Image Control instead of the Server side Image Control as shown below:
           <img alt="Icon" src="/Images/Icon1.jpg" id="Image1" />
           <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
           
            <cc1:CalendarExtender ID="CalendarExtender1" runat="server"
            TargetControlID="TextBox1" PopupButtonID="Image1"/>
    Note: In case you are clicking on the textbox to open the calendar, then in earlier versions of the toolkit, the calendar would not hide automatically when the user clicked anywhere outside the Calendar control. However this was fixed in the later versions. In fact, in the latest version, the Calendar hides automatically when a date is selected.
    If for some reason you are facing issues with the Calendar not hiding automatically, make sure that you have the latest version of the AJAX Control Toolkit.
    Tip 2: How to Add a CalendarExtender to a GridView
    If you want to add a CalendarExtender to a GridView, use a template field with a TextBox and CalendarExtender as shown below:
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
                DataSourceID="SqlDataSource1" ShowFooter="true" AllowPaging="True" AllowSorting="True">
                <Columns>           
                   <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
                     SortExpression="CategoryID" />
                      <asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
                     SortExpression="CategoryName" />
                  <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                        <cc1:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="TextBox1"/>
                    </ItemTemplate>
                </asp:TemplateField>               
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=SUPROTIM;Initial Catalog=Northwind;Integrated Security=True"
                SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories]" >
            </asp:SqlDataSource>
            </div>
        </form>
    Tip 3: Enable Year Navigation in CalendarExtender
    When the calendar appears, click on the title of the calendar to change the view to Months in the current year. Clicking it again, switches the view to Years, showing 10 years at a time.
    If you plan to do this programmatically, here’s some code for you. Use the OnClientShown event and switch the mode using javascript. This tip was shared by one of the Microsoft® support person at the asp.net forums.
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
     <cc1:CalendarExtender ID="CalendarExtender1"
    runat="server" TargetControlID="TextBox1" OnClientShown="ChangeCalendarView" />
    Then add this to the <head> section
    <head runat="server">
    <title>CalendarExtender</title>
    <script type="text/javascript">
    function ChangeCalendarView(sender,args)
    {
       sender._switchMode("years", true);           
    }
    </script>
    </head>
    Tip 4: Display only the day and month in the CalendarExtender
    To select only the day and month without the year, use the Format property of the CalendarExtender and set it to “dd/MM” as shown below:
    <cc1:CalendarExtender ID="CalendarExtender1" runat="server" Format="dd/MM" TargetControlID="TextBox1" />
    Tip 5: How to Set Culture to work with CalendarExtender
    Make sure that the ScriptManager has EnableScriptGlobalization="true" and EnableScriptLocalization="true".
    <asp:ScriptManager ID="ScriptManager1" runat="server"
             EnableScriptGlobalization="true" EnableScriptLocalization="true" />
    Tip 6: How to make sure user does not select a date earlier than today or greater than today
    There could be instances where you do not want the user to select a day earlier than the current date. For example: when you are providing the user a form to book tickets, you would not like him to choose an earlier date. To achieve this requirement, use the following javascript code.
    Prevent the User from selecting a Date Earlier than today
    <head runat="server">
        <title>Calendar Extender</title>
        <script type="text/javascript">
        function checkDate(sender,args)
    {
     if (sender._selectedDate < new Date())
                {
                    alert("You cannot select a day earlier than today!");
                    sender._selectedDate = new Date(); 
                    // set the date back to the current date
    sender._textbox.set_Value(sender._selectedDate.format(sender._format))
                }
    }
        </script>
    </head>
    Call the code:
       <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <div>
              
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <cc1:CalendarExtender ID="CalendarExtender1"
                runat="server" OnClientDateSelectionChanged="checkDate" TargetControlID="TextBox1" />
            </div>
        </form>
    Select Date Greater than today
    In the javascript, just change this line
    sender._selectedDate > new Date()
    Note: You may argue that the user can still change the date by typing into the textbox or entering an invalid date. Well that can be easily handled using a ValidationControl and is covered in the next tip.
    Tip 7: Add validation to the CalendarExtender Control
    A simple way to add validation to the Calendar is to add a ValidationControl to the textbox associated with a CalendarExtender. You have two choices:
    A.  Add an ‘Extender’ to the ValidationControl. To do so, drag and drop a ValidationControl > click on the smart tag of the ValidationControl > choose ‘Add Extender’. From the Extender Wizard, choose ValidatorCalloutExtender. Using this approach makes it extremely easy to discover and attach control extenders to your controls. In VS 2005, you had to do this process manually, by wiring up control extenders.
    B.  You can choose not to add the Extender.
    We will go ahead with option A. We will be adding two ValidationControls to the textbox. The first, a CompareValidator to check if the user does not enter an invalid date (Eg: May 32) and second, a RangeValidator to keep the date range as desired.
    Adding CompareValidator
    <asp:CompareValidator ID="CompareValidator1" runat="server"
                    ControlToValidate="TextBox1" Display="Dynamic" ErrorMessage="Invalid Date"
                    Operator="DataTypeCheck" Type="Date">
    </asp:CompareValidator>
    <cc1:ValidatorCalloutExtender ID="CompareValidator1_ValidatorCalloutExtender"
                    runat="server" Enabled="True" TargetControlID="CompareValidator1">
    </cc1:ValidatorCalloutExtender>
    Adding RangeValidator – We will restrict the user to select a date range starting from today to 15 days from now.
    <asp:RangeValidator ID="RangeValidator1" runat="server"
                    ControlToValidate="TextBox1" ErrorMessage="RangeValidator"
                    Type="Date">
    </asp:RangeValidator>
    <cc1:ValidatorCalloutExtender ID="RangeValidator1_ValidatorCalloutExtender"
                    runat="server" Enabled="True" TargetControlID="RangeValidator1">
    </cc1:ValidatorCalloutExtender>
    In the code behind of your page, add this code
    C#
        protected void Page_Load(object sender, EventArgs e)
        {
            RangeValidator1.MinimumValue = System.DateTime.Now.ToShortDateString();
            RangeValidator1.MaximumValue = System.DateTime.Now.AddDays(15).ToShortDateString();
        }
    Tip 8: CalendarExtender Popup Window bring to front 
    When user selects a date form the Calendar Extender. In web page if there is any images bellow of the calendar extender control it will go behind of that image. To bring front we need to add the following script 
     function SetIndex(sender)
    {
     sender._popupDiv.style.zIndex=501;
    }
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <cc1:CalendarExtender ID="CalendarExtender1"
                runat="server" OnClientDateSelectionChanged="checkDate" OnClientShown="SetIndex" TargetControlID="TextBox1" />

    Well those were some tips associated with the CalendarExtender. As future versions of the toolkit are released, we should be hopeful that there will exist easier ways, of achieving the functionality discussed in this article. I hope this article was useful and I thank you for viewing it.