This is a migrated thread and some comments may be shown as answers.

Extended RadDatePicker losing state on postback

5 Answers 170 Views
Calendar
This is a migrated thread and some comments may be shown as answers.
Kit
Top achievements
Rank 1
Kit asked on 23 Nov 2010, 04:25 PM
Right, this is doing my head in.

I've extended a RadDatePicker to enable a pair of them to link up and essentially set the Min and Max dates of each other.  Problem is that its not being persisted on postback.  Like a custom user control which hasn't been saved in ControlState.  Thing is, I can't see how to persist it...

Code for PairedRadDatePicker.cs:
using System;
using System.Web;
using Telerik.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
 
namespace Sonic.Infrastructure
{
    public enum PairedMinMax { GreaterThan, GreaterThanOrEqual, LesserThan, LesserThanOrEqual }
 
    public class PairedRadDatePicker : RadDatePicker
    {
        public string PairedControlID { get; set; }
        public PairedMinMax PairedOperator { get; set; }
 
        public override string UniqueID
        {
            get { return this.ID; }
        }
 
        public override string ClientID
        {
            get { return this.ID; }
        }
 
        protected override void OnLoad(EventArgs e)
        {
            if (PairedControlID != null && PairedControlID != string.Empty)
            {
                this.ClientEvents.OnDateSelected = "function(){itsMinMaxRadDatePicker('" + this.ClientID + "', '" + PairedControlID + "', '" + PairedOperator.ToString() + "');}";
 
                if (!Page.ClientScript.IsClientScriptIncludeRegistered("PairedRadDatePicker"))
                {
                    Page.ClientScript.RegisterClientScriptInclude("PairedRadDatePicker", "/Scripts/PairedRadDatePicker.js");
                }
            }
        }
 
    }
}
 And they are added to the page like so:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/FormMasterPage2.master" AutoEventWireup="true" CodeBehind="AcademicYearEdit.aspx.cs" Inherits="Sonic.Infrastructure.AcademicYearEdit" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<%@ Register Assembly="Sonic" Namespace="Sonic.Infrastructure" TagPrefix="sonic" %>
 
<asp:Content ID="Content3" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
 
<p><sonic:PairedRadDatePicker ID="PairedDatePicker1" PairedControlID="PairedRadDatePicker2" SelectedDate="2010/05/06" PairedOperator="LesserThan" runat="server" /></p>
 
<p><sonic:PairedRadDatePicker ID="PairedRadDatePicker2" PairedControlID="PairedDatePicker1" PairedOperator="GreaterThan" runat="server" /></p>
 
<asp:Button ID="btnSave" OnClick="btnSave_Click" Text="save" runat="server" />
 
<asp:Label ID="lblDates" runat="server" />
 
</asp:Content>

And the routine for the button in the page code behind:
protected void btnSave_Click(object sender, EventArgs e)
{
    DateTime? st_date = PairedDatePicker1.SelectedDate;
    lblDates.Text = st_date.ToString();
}

On a normal web page, postback isn't a problem.  On a Master/Content page, values are lost on postback.

I've done loads of user controls, loading and retrieving properties in ControlState.  But this is different, I'm extending the RadDatePicker class and I can't see how to persist it.

Any pointers please?

kitster

5 Answers, 1 is accepted

Sort by
0
Radoslav
Telerik team
answered on 26 Nov 2010, 08:33 AM
Hi Kit,

Could you please try persisting the PairedControlID and PairedOperator into the ViewState and let me know if the issue still exists:
public string PairedControlID
    {
        get
        {
            if (ViewState["PairedControlID"] == null)
            {
                ViewState["PairedControlID"] = string.Empty;
            }
 
            return ViewState["PairedControlID"].ToString();
        }
        set
        {
            ViewState["PairedControlID"] = value;
        }
    }
 
    public PairedMinMax PairedOperator
    {
        get
        {
            if (ViewState["PairedOperator"] == null)
            {
                ViewState["PairedOperator"] = PairedMinMax.GreaterThan;
            }
 
            return (PairedMinMax)Enum.Parse(typeof(PairedMinMax), ViewState["PairedOperator"].ToString());
        }
        set
        {
            ViewState["PairedOperator"] = value;
        }
    }

I hope this helps.

Kind regards,
Radoslav
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
Kit
Top achievements
Rank 1
answered on 29 Nov 2010, 10:18 AM
Hi Radoslav, thanks for your reply.

Moving the PairedControlID and PairedOperator into ViewState works for them, but I don't think I made myself clear.

Its not those properties which aren't being persisted on postback, its the RadDatePicker's properties, specifically SelectedDate (haven't tested any of the other properties yet).  Using the code below, PairedControlID and PairedOperator are persisted, but the SelectedDate is reset to the default on postback.  This is my major problem.

Code as follows:

PairedRadDatePicker.cs
using System;
using System.Web;
using Telerik.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
using System.Collections.Specialized;
 
namespace Sonic.Infrastructure
{
    public enum PairedMinMax { NotSet = 0, GreaterThan = 1, GreaterThanOrEqual = 2, LesserThan = 3, LesserThanOrEqual = 4 }
 
    public class PairedRadDatePicker : RadDatePicker, IPostBackEventHandler
    {
        public string PairedControlID
        {
            get
            {
                if (ViewState["PairedControlID"] == null)
                {
                    ViewState["PairedControlID"] = string.Empty;
                }
 
                return ViewState["PairedControlID"].ToString();
            }
            set
            {
                ViewState["PairedControlID"] = value;
            }
        }
 
        public PairedMinMax PairedOperator
        {
            get
            {
                if (ViewState["PairedOperator"] == null)
                {
                    ViewState["PairedOperator"] = PairedMinMax.GreaterThan;
                }
 
                return (PairedMinMax)Enum.Parse(typeof(PairedMinMax), ViewState["PairedOperator"].ToString());
            }
            set
            {
                ViewState["PairedOperator"] = value;
            }
        }
     }
}

datetestmaster.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/FormMasterPage2.master" AutoEventWireup="true" CodeBehind="datetestmaster.aspx.cs" Inherits="Sonic.Infrastructure.datetestmaster" %>
<%@ Register Assembly="Sonic" Namespace="Sonic.Infrastructure" TagPrefix="sonic" %>
 
<asp:Content ID="Content3" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
        <p>user control 1: <sonic:PairedRadDatePicker ID="PairedDatePicker1" PairedControlID="PairedRadDatePicker2" SelectedDate="2010/05/06" PairedOperator="LesserThan" runat="server" /></p>
 
         <p>user control 2: <sonic:PairedRadDatePicker ID="PairedRadDatePicker2" PairedControlID="PairedDatePicker1" PairedOperator="GreaterThan" runat="server" /></p>
 
         <p>
            <asp:ListBox ID="lstOperator" runat="server">
                <asp:ListItem Text="" Value="0" />
                <asp:ListItem Text="Lesser Than" Value="3" />
                <asp:ListItem Text="Lesser Than Or Equal" Value="4" />
                <asp:ListItem Text="Greater Than" Value="1" />
                <asp:ListItem Text="Greater Than Or Equal" Value="2" />
            </asp:ListBox>
        </p>
 
         <asp:Button ID="btnSave" OnClick="btnSave_Click" Text="save" runat="server" />
 
         <asp:Label ID="lblDates" runat="server" />
</asp:Content>

datetestmaster.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace Sonic.Infrastructure
{
    public partial class datetestmaster : System.Web.UI.Page
    {
        protected void btnSave_Click(object sender, EventArgs e)
        {
            lblDates.Text = PairedDatePicker1.PairedOperator.ToString() + "<br />";
            if (lstOperator.SelectedValue != "")
            {
                PairedDatePicker1.PairedOperator = (PairedMinMax)Convert.ToInt32(lstOperator.SelectedValue);
            }
            DateTime? st_date = PairedDatePicker1.SelectedDate;
            lblDates.Text += st_date.ToString() + " - " + PairedDatePicker1.PairedOperator.ToString();
        }
    }
}
0
Radoslav
Telerik team
answered on 01 Dec 2010, 01:16 PM
Hi Kit,

I still could not reproduce the described behavior . I am sending you a simple example, based on your code, however everything works as expected. Please check it out and let me know what differs in your case. Also on the following link you could find a simple video which shows how the example works on my side.
Additionally could you please verify that you use the latest version of RadControls for ASP.NET AJAX.
Looking forward for your reply.

Best wishes,
Radoslav
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
Kit
Top achievements
Rank 1
answered on 01 Dec 2010, 03:36 PM
Radoslav,

Your supplied project works like a treat.  I'm quite confused as to how it does and my code doesn't, it must be something to do with the Master page, that's the only thing I can think of which is different.  Let me chase it a while and see what I can find.

Thanks for sticking with it, much appreciated.

kitster
0
Kit
Top achievements
Rank 1
answered on 01 Dec 2010, 04:30 PM

Radoslav,

Your supplied project works like a treat.  I'm quite confused as to how it does and my code doesn't, it must be something to do with the Master page, that's the only thing I can think of which is different.  Let me chase it a while and see what I can find.

Thanks for sticking with it, much appreciated.

kitster

Tags
Calendar
Asked by
Kit
Top achievements
Rank 1
Answers by
Radoslav
Telerik team
Kit
Top achievements
Rank 1
Share this question
or