Link to home
Start Free TrialLog in
Avatar of xrimson77
xrimson77

asked on

Loading Postback data for a composite control

I am having trouble with postback data for a composite control.  The control is esentially a texbox, but can be a label if the ReadOnly property is set to true.  On postback, I can't seem to get the value of the textbox.  It is really weird to me also because once the page is fully rendered, the textbox contains the posted value!! What is going on??

aspx code
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Namespace="MyControls" TagPrefix="sgm" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       TextBox1
       <asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>
       <br />
       TextBox2
       <sgm:SgmTextBox ID="TextBox2" runat="server" />
       <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick" />
    </div>
    </form>
</body>
</html>

==================================================
aspx.cs code

using System;
using System.Web.UI;

public partial class _Default :Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button1_OnClick(object sender, EventArgs e)
    {
        TextBox1.Text += "!";
        TextBox2.Text += "!";
    }
}


==================================================
SgmTextBox.cs code in App_Code


using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Specialized;

namespace MyControls
{

    [DefaultProperty("Text")]
    [ToolboxData("<{0}:SgmTextBox runat=\"server\"></{0}:SgmTextBox>")]
    public sealed class SgmTextBox : CompositeControl, IPostBackDataHandler
    {
        public SgmTextBox()
        {
        }

        [Bindable(false)]
        [Browsable(true)]
        [Category("Behavior")]
        [DefaultValue(false)]
        [Themeable(true)]
        public bool ReadOnly
        {
            get
            {
                object readOnly = ViewState["ReadOnly"];
                return (readOnly != null) ? (bool)readOnly : false;
            }
            set
            {
                ViewState["ReadOnly"] = value;
            }
        }

        [Bindable(true)]
        [Browsable(true)]
        [Category("Data")]
        [DefaultValue("")]
        [Themeable(false)]
        public string Text
        {
            get
            {
                object text = ViewState["Text"];
                return (text != null) ? (string)text : string.Empty;
            }
            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void CreateChildControls()
        {
            Controls.Clear();

            if (ReadOnly)
            {
                Label label = new Label();
                label.EnableViewState = false;
                Controls.Add(label);
            }
            else
            {
                TextBox textBox = new TextBox();
                textBox.EnableViewState = false;
                textBox.Height = Height;
                textBox.Width = Width;
                Controls.Add(textBox);
            }
        }

        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            string currentText = Text;
            string postedText = postCollection[postDataKey];
            if (!currentText.Equals(postedText, StringComparison.Ordinal))
            {
                Text = postedText;
                return true;
            }
            return false;
        }
        public void RaisePostDataChangedEvent()
        {
            return;
        }
    }
}

ASKER CERTIFIED SOLUTION
Avatar of Edwin_C
Edwin_C
Flag of Hong Kong image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial