How to perform server-side form reset?

Discussion in 'ASP .Net' started by =?Utf-8?B?TGVlIENoYXBtYW4=?=, Aug 24, 2005.

  1. Hi,

    Can anyone tell me why in the code below, the call to ClearChildViewState()
    has no effect?

    To paraphrase the code: I'm using view state. I have a textbox and a submit
    button (and a label that can be ignored). When I press the button the first
    time, the click handler hides the textbox. Pressing the button a second time
    unhides the textbox. The text box is maintaining its value when hidden via
    view state. (The value is NOT being populated due to postback data.) I want a
    server-side function to reset a form to it's initial state (i.e. the state it
    was in when I first browsed to it). I expected Page.ClearChildViewState() to
    do this, but it doesn't. Why not? And what can I do to reset my form on the
    server without disabling viewstate?

    Thanks,
    - Lee

    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
    Inherits="WebTest.WebForm1" EnableViewState="true" %>
    <%@ Register TagPrefix="My" Namespace="WebTest" Assembly="WebTest" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>WebForm1</title>
    </HEAD>
    <body >
    <form id="Form1" method="post" runat="server">
    <My:TextBox id="TextBox1" runat="server" EnableViewState="true"></My:TextBox>
    <asp:Button id="Button1" runat="server" Text="Hide"></asp:Button>
    <p><asp:Label id="Label1" runat="server"></asp:Label></p>
    </form>
    </body>
    </HTML>

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    namespace WebTest
    {
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button Button1;
    protected System.Web.UI.WebControls.Label Label1;
    protected System.Web.UI.WebControls.TextBox TextBox1;

    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }

    private void InitializeComponent()
    {
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    }
    #endregion

    private void Button1_Click(object sender, System.EventArgs e)
    {
    if (!this.IsTrackingViewState)
    throw new ApplicationException();

    WebTest.TextBox c = (WebTest.TextBox)this.FindControl("TextBox1");

    System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    this.ClearChildViewState(); // Why does this have no effect?
    System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);

    if (this.Button1.Text == "Hide")
    {
    this.Button1.Text = "Show";
    this.TextBox1.Visible = false;

    if (this.TextBox1.Text.Length > 0)
    this.Label1.Text = this.TextBox1.Text;
    }
    else // "Show"
    {
    this.Button1.Text = "Hide";
    this.TextBox1.Visible = true;
    }
    }
    }
    }

    using System;
    using System.Web.UI;

    namespace WebTest
    {
    public class TextBox : System.Web.UI.WebControls.TextBox
    {
    protected override object SaveViewState()
    {
    object vs = null;

    vs = base.SaveViewState ();

    return vs;
    }

    protected override void LoadViewState(object savedState)
    {
    base.LoadViewState (savedState);
    }

    public StateBag GetViewState()
    {
    return this.ViewState;
    }
    }
    }
     
    =?Utf-8?B?TGVlIENoYXBtYW4=?=, Aug 24, 2005
    #1
    1. Advertising

  2. =?Utf-8?B?TGVlIENoYXBtYW4=?=

    Bruce Barker Guest

    because the click event fires long after the textbox has feteched its value
    from viewstate.

    -- bruce (sqlwork.com)


    "Lee Chapman" <> wrote in message
    news:...
    >
    > Hi,
    >
    > Can anyone tell me why in the code below, the call to
    > ClearChildViewState()
    > has no effect?
    >
    > To paraphrase the code: I'm using view state. I have a textbox and a
    > submit
    > button (and a label that can be ignored). When I press the button the
    > first
    > time, the click handler hides the textbox. Pressing the button a second
    > time
    > unhides the textbox. The text box is maintaining its value when hidden via
    > view state. (The value is NOT being populated due to postback data.) I
    > want a
    > server-side function to reset a form to it's initial state (i.e. the state
    > it
    > was in when I first browsed to it). I expected Page.ClearChildViewState()
    > to
    > do this, but it doesn't. Why not? And what can I do to reset my form on
    > the
    > server without disabling viewstate?
    >
    > Thanks,
    > - Lee
    >
    > <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
    > AutoEventWireup="false"
    > Inherits="WebTest.WebForm1" EnableViewState="true" %>
    > <%@ Register TagPrefix="My" Namespace="WebTest" Assembly="WebTest" %>
    > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    > <HTML>
    > <HEAD>
    > <title>WebForm1</title>
    > </HEAD>
    > <body >
    > <form id="Form1" method="post" runat="server">
    > <My:TextBox id="TextBox1" runat="server"
    > EnableViewState="true"></My:TextBox>
    > <asp:Button id="Button1" runat="server" Text="Hide"></asp:Button>
    > <p><asp:Label id="Label1" runat="server"></asp:Label></p>
    > </form>
    > </body>
    > </HTML>
    >
    > using System;
    > using System.Collections;
    > using System.ComponentModel;
    > using System.Data;
    > using System.Drawing;
    > using System.Web;
    > using System.Web.SessionState;
    > using System.Web.UI;
    > using System.Web.UI.WebControls;
    > using System.Web.UI.HtmlControls;
    >
    > namespace WebTest
    > {
    > /// <summary>
    > /// Summary description for WebForm1.
    > /// </summary>
    > public class WebForm1 : System.Web.UI.Page
    > {
    > protected System.Web.UI.WebControls.Button Button1;
    > protected System.Web.UI.WebControls.Label Label1;
    > protected System.Web.UI.WebControls.TextBox TextBox1;
    >
    > #region Web Form Designer generated code
    > override protected void OnInit(EventArgs e)
    > {
    > InitializeComponent();
    > base.OnInit(e);
    > }
    >
    > private void InitializeComponent()
    > {
    > this.Button1.Click += new System.EventHandler(this.Button1_Click);
    > }
    > #endregion
    >
    > private void Button1_Click(object sender, System.EventArgs e)
    > {
    > if (!this.IsTrackingViewState)
    > throw new ApplicationException();
    >
    > WebTest.TextBox c = (WebTest.TextBox)this.FindControl("TextBox1");
    >
    > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    > this.ClearChildViewState(); // Why does this have no effect?
    > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    >
    > if (this.Button1.Text == "Hide")
    > {
    > this.Button1.Text = "Show";
    > this.TextBox1.Visible = false;
    >
    > if (this.TextBox1.Text.Length > 0)
    > this.Label1.Text = this.TextBox1.Text;
    > }
    > else // "Show"
    > {
    > this.Button1.Text = "Hide";
    > this.TextBox1.Visible = true;
    > }
    > }
    > }
    > }
    >
    > using System;
    > using System.Web.UI;
    >
    > namespace WebTest
    > {
    > public class TextBox : System.Web.UI.WebControls.TextBox
    > {
    > protected override object SaveViewState()
    > {
    > object vs = null;
    >
    > vs = base.SaveViewState ();
    >
    > return vs;
    > }
    >
    > protected override void LoadViewState(object savedState)
    > {
    > base.LoadViewState (savedState);
    > }
    >
    > public StateBag GetViewState()
    > {
    > return this.ViewState;
    > }
    > }
    > }
    >
    >
     
    Bruce Barker, Aug 24, 2005
    #2
    1. Advertising

  3. Thanks for Bruce's informative inputs,

    Hi Lee,

    As Bruce has mentioned, the LoadViewState is getting executed before Load
    event for controls/page , after that the propertes value is assigned to the
    Control/page instance, and these properteis will be persisted into
    viewstate again before Rendering. So change the ViewState in PostBack event
    handler ( After Load ViewSate before save viewstate) won't have any effect.
    also, IMO, I'd recommend you directly clear those entry fields control's
    content through the instance properties rather than accessing the ViewState
    collection.

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)
    --------------------
    | From: "Bruce Barker" <>
    | References: <>
    | Subject: Re: How to perform server-side form reset?
    | Date: Wed, 24 Aug 2005 09:01:14 -0700
    | Lines: 148
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
    | X-RFC2646: Format=Flowed; Original
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
    | Message-ID: <#>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | NNTP-Posting-Host: rdcsd1.safeco.com 12.144.134.2
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
    | Xref: TK2MSFTNGXA01.phx.gbl
    microsoft.public.dotnet.framework.aspnet:119990
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    |
    | because the click event fires long after the textbox has feteched its
    value
    | from viewstate.
    |
    | -- bruce (sqlwork.com)
    |
    |
    | "Lee Chapman" <> wrote in message
    | news:...
    | >
    | > Hi,
    | >
    | > Can anyone tell me why in the code below, the call to
    | > ClearChildViewState()
    | > has no effect?
    | >
    | > To paraphrase the code: I'm using view state. I have a textbox and a
    | > submit
    | > button (and a label that can be ignored). When I press the button the
    | > first
    | > time, the click handler hides the textbox. Pressing the button a second
    | > time
    | > unhides the textbox. The text box is maintaining its value when hidden
    via
    | > view state. (The value is NOT being populated due to postback data.) I
    | > want a
    | > server-side function to reset a form to it's initial state (i.e. the
    state
    | > it
    | > was in when I first browsed to it). I expected
    Page.ClearChildViewState()
    | > to
    | > do this, but it doesn't. Why not? And what can I do to reset my form on
    | > the
    | > server without disabling viewstate?
    | >
    | > Thanks,
    | > - Lee
    | >
    | > <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
    | > AutoEventWireup="false"
    | > Inherits="WebTest.WebForm1" EnableViewState="true" %>
    | > <%@ Register TagPrefix="My" Namespace="WebTest" Assembly="WebTest" %>
    | > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    | > <HTML>
    | > <HEAD>
    | > <title>WebForm1</title>
    | > </HEAD>
    | > <body >
    | > <form id="Form1" method="post" runat="server">
    | > <My:TextBox id="TextBox1" runat="server"
    | > EnableViewState="true"></My:TextBox>
    | > <asp:Button id="Button1" runat="server" Text="Hide"></asp:Button>
    | > <p><asp:Label id="Label1" runat="server"></asp:Label></p>
    | > </form>
    | > </body>
    | > </HTML>
    | >
    | > using System;
    | > using System.Collections;
    | > using System.ComponentModel;
    | > using System.Data;
    | > using System.Drawing;
    | > using System.Web;
    | > using System.Web.SessionState;
    | > using System.Web.UI;
    | > using System.Web.UI.WebControls;
    | > using System.Web.UI.HtmlControls;
    | >
    | > namespace WebTest
    | > {
    | > /// <summary>
    | > /// Summary description for WebForm1.
    | > /// </summary>
    | > public class WebForm1 : System.Web.UI.Page
    | > {
    | > protected System.Web.UI.WebControls.Button Button1;
    | > protected System.Web.UI.WebControls.Label Label1;
    | > protected System.Web.UI.WebControls.TextBox TextBox1;
    | >
    | > #region Web Form Designer generated code
    | > override protected void OnInit(EventArgs e)
    | > {
    | > InitializeComponent();
    | > base.OnInit(e);
    | > }
    | >
    | > private void InitializeComponent()
    | > {
    | > this.Button1.Click += new System.EventHandler(this.Button1_Click);
    | > }
    | > #endregion
    | >
    | > private void Button1_Click(object sender, System.EventArgs e)
    | > {
    | > if (!this.IsTrackingViewState)
    | > throw new ApplicationException();
    | >
    | > WebTest.TextBox c = (WebTest.TextBox)this.FindControl("TextBox1");
    | >
    | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    | > this.ClearChildViewState(); // Why does this have no effect?
    | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    | >
    | > if (this.Button1.Text == "Hide")
    | > {
    | > this.Button1.Text = "Show";
    | > this.TextBox1.Visible = false;
    | >
    | > if (this.TextBox1.Text.Length > 0)
    | > this.Label1.Text = this.TextBox1.Text;
    | > }
    | > else // "Show"
    | > {
    | > this.Button1.Text = "Hide";
    | > this.TextBox1.Visible = true;
    | > }
    | > }
    | > }
    | > }
    | >
    | > using System;
    | > using System.Web.UI;
    | >
    | > namespace WebTest
    | > {
    | > public class TextBox : System.Web.UI.WebControls.TextBox
    | > {
    | > protected override object SaveViewState()
    | > {
    | > object vs = null;
    | >
    | > vs = base.SaveViewState ();
    | >
    | > return vs;
    | > }
    | >
    | > protected override void LoadViewState(object savedState)
    | > {
    | > base.LoadViewState (savedState);
    | > }
    | >
    | > public StateBag GetViewState()
    | > {
    | > return this.ViewState;
    | > }
    | > }
    | > }
    | >
    | >
    |
    |
    |
     
    Steven Cheng[MSFT], Aug 25, 2005
    #3
  4. Hi,

    I see. The examples in ASP.NET Developing Server Controls & Components
    implement properties that persist via view state in the following way:

    public string Action
    {
    get
    {
    string action = (string)(ViewState["Action"]);
    return action == null ? String.Empty : action;
    }
    set
    {
    ViewState["Action"] = value;
    }
    }

    So I assumed that I would be able to reset the state that a control persists
    via view state by clearing view state, even in a click event (which I
    understand fires after view state has been restored).

    However, I guess most controls must do things differently; perhaps they do
    something like:

    private string action;

    public string Action
    {
    get { return this.action; }
    set { this.action = value; }
    }

    protected override object SaveViewState()
    {
    return this.action;
    }

    protected override void LoadViewState(object savedState)
    {
    this.action = (string)savedState;
    }

    Which would explain what's going on.

    So going back to my original problem, it looks like I will have to reset my
    form manually, as you suggest, by resetting the object properties that I care
    about. That's more code - and code that has to remain in sync with the
    controls on the page - but if there's no "reset my controls" silver bullet,
    then I guess I have no choice.

    Thanks,
    - Lee


    "Steven Cheng[MSFT]" wrote:

    > Thanks for Bruce's informative inputs,
    >
    > Hi Lee,
    >
    > As Bruce has mentioned, the LoadViewState is getting executed before Load
    > event for controls/page , after that the propertes value is assigned to the
    > Control/page instance, and these properteis will be persisted into
    > viewstate again before Rendering. So change the ViewState in PostBack event
    > handler ( After Load ViewSate before save viewstate) won't have any effect.
    > also, IMO, I'd recommend you directly clear those entry fields control's
    > content through the instance properties rather than accessing the ViewState
    > collection.
    >
    > Thanks,
    >
    > Steven Cheng
    > Microsoft Online Support
    >
    > Get Secure! www.microsoft.com/security
    > (This posting is provided "AS IS", with no warranties, and confers no
    > rights.)
    > --------------------
    > | From: "Bruce Barker" <>
    > | References: <>
    > | Subject: Re: How to perform server-side form reset?
    > | Date: Wed, 24 Aug 2005 09:01:14 -0700
    > | Lines: 148
    > | X-Priority: 3
    > | X-MSMail-Priority: Normal
    > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
    > | X-RFC2646: Format=Flowed; Original
    > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
    > | Message-ID: <#>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    > | NNTP-Posting-Host: rdcsd1.safeco.com 12.144.134.2
    > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
    > | Xref: TK2MSFTNGXA01.phx.gbl
    > microsoft.public.dotnet.framework.aspnet:119990
    > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    > |
    > | because the click event fires long after the textbox has feteched its
    > value
    > | from viewstate.
    > |
    > | -- bruce (sqlwork.com)
    > |
    > |
    > | "Lee Chapman" <> wrote in message
    > | news:...
    > | >
    > | > Hi,
    > | >
    > | > Can anyone tell me why in the code below, the call to
    > | > ClearChildViewState()
    > | > has no effect?
    > | >
    > | > To paraphrase the code: I'm using view state. I have a textbox and a
    > | > submit
    > | > button (and a label that can be ignored). When I press the button the
    > | > first
    > | > time, the click handler hides the textbox. Pressing the button a second
    > | > time
    > | > unhides the textbox. The text box is maintaining its value when hidden
    > via
    > | > view state. (The value is NOT being populated due to postback data.) I
    > | > want a
    > | > server-side function to reset a form to it's initial state (i.e. the
    > state
    > | > it
    > | > was in when I first browsed to it). I expected
    > Page.ClearChildViewState()
    > | > to
    > | > do this, but it doesn't. Why not? And what can I do to reset my form on
    > | > the
    > | > server without disabling viewstate?
    > | >
    > | > Thanks,
    > | > - Lee
    > | >
    > | > <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
    > | > AutoEventWireup="false"
    > | > Inherits="WebTest.WebForm1" EnableViewState="true" %>
    > | > <%@ Register TagPrefix="My" Namespace="WebTest" Assembly="WebTest" %>
    > | > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    > | > <HTML>
    > | > <HEAD>
    > | > <title>WebForm1</title>
    > | > </HEAD>
    > | > <body >
    > | > <form id="Form1" method="post" runat="server">
    > | > <My:TextBox id="TextBox1" runat="server"
    > | > EnableViewState="true"></My:TextBox>
    > | > <asp:Button id="Button1" runat="server" Text="Hide"></asp:Button>
    > | > <p><asp:Label id="Label1" runat="server"></asp:Label></p>
    > | > </form>
    > | > </body>
    > | > </HTML>
    > | >
    > | > using System;
    > | > using System.Collections;
    > | > using System.ComponentModel;
    > | > using System.Data;
    > | > using System.Drawing;
    > | > using System.Web;
    > | > using System.Web.SessionState;
    > | > using System.Web.UI;
    > | > using System.Web.UI.WebControls;
    > | > using System.Web.UI.HtmlControls;
    > | >
    > | > namespace WebTest
    > | > {
    > | > /// <summary>
    > | > /// Summary description for WebForm1.
    > | > /// </summary>
    > | > public class WebForm1 : System.Web.UI.Page
    > | > {
    > | > protected System.Web.UI.WebControls.Button Button1;
    > | > protected System.Web.UI.WebControls.Label Label1;
    > | > protected System.Web.UI.WebControls.TextBox TextBox1;
    > | >
    > | > #region Web Form Designer generated code
    > | > override protected void OnInit(EventArgs e)
    > | > {
    > | > InitializeComponent();
    > | > base.OnInit(e);
    > | > }
    > | >
    > | > private void InitializeComponent()
    > | > {
    > | > this.Button1.Click += new System.EventHandler(this.Button1_Click);
    > | > }
    > | > #endregion
    > | >
    > | > private void Button1_Click(object sender, System.EventArgs e)
    > | > {
    > | > if (!this.IsTrackingViewState)
    > | > throw new ApplicationException();
    > | >
    > | > WebTest.TextBox c = (WebTest.TextBox)this.FindControl("TextBox1");
    > | >
    > | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    > | > this.ClearChildViewState(); // Why does this have no effect?
    > | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    > | >
    > | > if (this.Button1.Text == "Hide")
    > | > {
    > | > this.Button1.Text = "Show";
    > | > this.TextBox1.Visible = false;
    > | >
    > | > if (this.TextBox1.Text.Length > 0)
    > | > this.Label1.Text = this.TextBox1.Text;
    > | > }
    > | > else // "Show"
    > | > {
    > | > this.Button1.Text = "Hide";
    > | > this.TextBox1.Visible = true;
    > | > }
    > | > }
    > | > }
    > | > }
    > | >
    > | > using System;
    > | > using System.Web.UI;
    > | >
    > | > namespace WebTest
    > | > {
    > | > public class TextBox : System.Web.UI.WebControls.TextBox
    > | > {
    > | > protected override object SaveViewState()
    > | > {
    > | > object vs = null;
    > | >
    > | > vs = base.SaveViewState ();
    > | >
    > | > return vs;
    > | > }
    > | >
    > | > protected override void LoadViewState(object savedState)
    > | > {
    > | > base.LoadViewState (savedState);
    > | > }
    > | >
    > | > public StateBag GetViewState()
    > | > {
    > | > return this.ViewState;
    > | > }
    > | > }
    > | > }
    > | >
    > | >
    > |
    > |
    > |
    >
    >
     
    =?Utf-8?B?TGVlIENoYXBtYW4=?=, Aug 25, 2005
    #4
  5. Thanks for the followup Lee,

    Yes, manually clear all the entry fields controls may cause the page code
    become tight-coupled, but it'll be the most efficient way. Also, if you
    want to make it more flexible, we can use the FindControl method to find
    all the enty fields controls thorugh the control ID and reset their text
    property, but this will be much less efficient.

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)
    --------------------
    | Thread-Topic: How to perform server-side form reset?
    | thread-index: AcWpW6aq6sDuDiD+SgiDrP/xnnn3Lw==
    | X-WBNR-Posting-Host: 194.200.242.250
    | From: "=?Utf-8?B?TGVlIENoYXBtYW4=?=" <>
    | References: <>
    <#>
    <>
    | Subject: Re: How to perform server-side form reset?
    | Date: Thu, 25 Aug 2005 02:59:15 -0700
    | Lines: 253
    | Message-ID: <>
    | MIME-Version: 1.0
    | Content-Type: text/plain;
    | charset="Utf-8"
    | Content-Transfer-Encoding: 7bit
    | X-Newsreader: Microsoft CDO for Windows 2000
    | Content-Class: urn:content-classes:message
    | Importance: normal
    | Priority: normal
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.0
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | NNTP-Posting-Host: TK2MSFTNGXA03.phx.gbl 10.40.2.250
    | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGXA03.phx.gbl
    | Xref: TK2MSFTNGXA01.phx.gbl
    microsoft.public.dotnet.framework.aspnet:120205
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    |
    |
    | Hi,
    |
    | I see. The examples in ASP.NET Developing Server Controls & Components
    | implement properties that persist via view state in the following way:
    |
    | public string Action
    | {
    | get
    | {
    | string action = (string)(ViewState["Action"]);
    | return action == null ? String.Empty : action;
    | }
    | set
    | {
    | ViewState["Action"] = value;
    | }
    | }
    |
    | So I assumed that I would be able to reset the state that a control
    persists
    | via view state by clearing view state, even in a click event (which I
    | understand fires after view state has been restored).
    |
    | However, I guess most controls must do things differently; perhaps they
    do
    | something like:
    |
    | private string action;
    |
    | public string Action
    | {
    | get { return this.action; }
    | set { this.action = value; }
    | }
    |
    | protected override object SaveViewState()
    | {
    | return this.action;
    | }
    |
    | protected override void LoadViewState(object savedState)
    | {
    | this.action = (string)savedState;
    | }
    |
    | Which would explain what's going on.
    |
    | So going back to my original problem, it looks like I will have to reset
    my
    | form manually, as you suggest, by resetting the object properties that I
    care
    | about. That's more code - and code that has to remain in sync with the
    | controls on the page - but if there's no "reset my controls" silver
    bullet,
    | then I guess I have no choice.
    |
    | Thanks,
    | - Lee
    |
    |
    | "Steven Cheng[MSFT]" wrote:
    |
    | > Thanks for Bruce's informative inputs,
    | >
    | > Hi Lee,
    | >
    | > As Bruce has mentioned, the LoadViewState is getting executed before
    Load
    | > event for controls/page , after that the propertes value is assigned to
    the
    | > Control/page instance, and these properteis will be persisted into
    | > viewstate again before Rendering. So change the ViewState in PostBack
    event
    | > handler ( After Load ViewSate before save viewstate) won't have any
    effect.
    | > also, IMO, I'd recommend you directly clear those entry fields
    control's
    | > content through the instance properties rather than accessing the
    ViewState
    | > collection.
    | >
    | > Thanks,
    | >
    | > Steven Cheng
    | > Microsoft Online Support
    | >
    | > Get Secure! www.microsoft.com/security
    | > (This posting is provided "AS IS", with no warranties, and confers no
    | > rights.)
    | > --------------------
    | > | From: "Bruce Barker" <>
    | > | References: <>
    | > | Subject: Re: How to perform server-side form reset?
    | > | Date: Wed, 24 Aug 2005 09:01:14 -0700
    | > | Lines: 148
    | > | X-Priority: 3
    | > | X-MSMail-Priority: Normal
    | > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
    | > | X-RFC2646: Format=Flowed; Original
    | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
    | > | Message-ID: <#>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | > | NNTP-Posting-Host: rdcsd1.safeco.com 12.144.134.2
    | > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
    | > | Xref: TK2MSFTNGXA01.phx.gbl
    | > microsoft.public.dotnet.framework.aspnet:119990
    | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    | > |
    | > | because the click event fires long after the textbox has feteched its
    | > value
    | > | from viewstate.
    | > |
    | > | -- bruce (sqlwork.com)
    | > |
    | > |
    | > | "Lee Chapman" <> wrote in message
    | > | news:...
    | > | >
    | > | > Hi,
    | > | >
    | > | > Can anyone tell me why in the code below, the call to
    | > | > ClearChildViewState()
    | > | > has no effect?
    | > | >
    | > | > To paraphrase the code: I'm using view state. I have a textbox and
    a
    | > | > submit
    | > | > button (and a label that can be ignored). When I press the button
    the
    | > | > first
    | > | > time, the click handler hides the textbox. Pressing the button a
    second
    | > | > time
    | > | > unhides the textbox. The text box is maintaining its value when
    hidden
    | > via
    | > | > view state. (The value is NOT being populated due to postback
    data.) I
    | > | > want a
    | > | > server-side function to reset a form to it's initial state (i.e.
    the
    | > state
    | > | > it
    | > | > was in when I first browsed to it). I expected
    | > Page.ClearChildViewState()
    | > | > to
    | > | > do this, but it doesn't. Why not? And what can I do to reset my
    form on
    | > | > the
    | > | > server without disabling viewstate?
    | > | >
    | > | > Thanks,
    | > | > - Lee
    | > | >
    | > | > <%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
    | > | > AutoEventWireup="false"
    | > | > Inherits="WebTest.WebForm1" EnableViewState="true" %>
    | > | > <%@ Register TagPrefix="My" Namespace="WebTest" Assembly="WebTest"
    %>
    | > | > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    | > | > <HTML>
    | > | > <HEAD>
    | > | > <title>WebForm1</title>
    | > | > </HEAD>
    | > | > <body >
    | > | > <form id="Form1" method="post" runat="server">
    | > | > <My:TextBox id="TextBox1" runat="server"
    | > | > EnableViewState="true"></My:TextBox>
    | > | > <asp:Button id="Button1" runat="server" Text="Hide"></asp:Button>
    | > | > <p><asp:Label id="Label1" runat="server"></asp:Label></p>
    | > | > </form>
    | > | > </body>
    | > | > </HTML>
    | > | >
    | > | > using System;
    | > | > using System.Collections;
    | > | > using System.ComponentModel;
    | > | > using System.Data;
    | > | > using System.Drawing;
    | > | > using System.Web;
    | > | > using System.Web.SessionState;
    | > | > using System.Web.UI;
    | > | > using System.Web.UI.WebControls;
    | > | > using System.Web.UI.HtmlControls;
    | > | >
    | > | > namespace WebTest
    | > | > {
    | > | > /// <summary>
    | > | > /// Summary description for WebForm1.
    | > | > /// </summary>
    | > | > public class WebForm1 : System.Web.UI.Page
    | > | > {
    | > | > protected System.Web.UI.WebControls.Button Button1;
    | > | > protected System.Web.UI.WebControls.Label Label1;
    | > | > protected System.Web.UI.WebControls.TextBox TextBox1;
    | > | >
    | > | > #region Web Form Designer generated code
    | > | > override protected void OnInit(EventArgs e)
    | > | > {
    | > | > InitializeComponent();
    | > | > base.OnInit(e);
    | > | > }
    | > | >
    | > | > private void InitializeComponent()
    | > | > {
    | > | > this.Button1.Click += new System.EventHandler(this.Button1_Click);
    | > | > }
    | > | > #endregion
    | > | >
    | > | > private void Button1_Click(object sender, System.EventArgs e)
    | > | > {
    | > | > if (!this.IsTrackingViewState)
    | > | > throw new ApplicationException();
    | > | >
    | > | > WebTest.TextBox c = (WebTest.TextBox)this.FindControl("TextBox1");
    | > | >
    | > | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    | > | > this.ClearChildViewState(); // Why does this have no effect?
    | > | > System.Diagnostics.Trace.WriteLine(c.GetViewState().Count);
    | > | >
    | > | > if (this.Button1.Text == "Hide")
    | > | > {
    | > | > this.Button1.Text = "Show";
    | > | > this.TextBox1.Visible = false;
    | > | >
    | > | > if (this.TextBox1.Text.Length > 0)
    | > | > this.Label1.Text = this.TextBox1.Text;
    | > | > }
    | > | > else // "Show"
    | > | > {
    | > | > this.Button1.Text = "Hide";
    | > | > this.TextBox1.Visible = true;
    | > | > }
    | > | > }
    | > | > }
    | > | > }
    | > | >
    | > | > using System;
    | > | > using System.Web.UI;
    | > | >
    | > | > namespace WebTest
    | > | > {
    | > | > public class TextBox : System.Web.UI.WebControls.TextBox
    | > | > {
    | > | > protected override object SaveViewState()
    | > | > {
    | > | > object vs = null;
    | > | >
    | > | > vs = base.SaveViewState ();
    | > | >
    | > | > return vs;
    | > | > }
    | > | >
    | > | > protected override void LoadViewState(object savedState)
    | > | > {
    | > | > base.LoadViewState (savedState);
    | > | > }
    | > | >
    | > | > public StateBag GetViewState()
    | > | > {
    | > | > return this.ViewState;
    | > | > }
    | > | > }
    | > | > }
    | > | >
    | > | >
    | > |
    | > |
    | > |
    | >
    | >
    |
     
    Steven Cheng[MSFT], Aug 26, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Martin Feuersteiner
    Replies:
    0
    Views:
    3,040
    Martin Feuersteiner
    Jul 19, 2004
  2. Mythran
    Replies:
    2
    Views:
    544
    Mythran
    Jan 22, 2005
  3. Naresh Agarwal
    Replies:
    0
    Views:
    337
    Naresh Agarwal
    Jan 27, 2004
  4. Mike Hofer
    Replies:
    1
    Views:
    461
  5. Mike Chen
    Replies:
    6
    Views:
    536
    Mike Chen
    Jan 29, 2007
Loading...

Share This Page