<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Custom Server Controls</title><link>http://forums.asp.net/19.aspx</link><description>All about building ASP.NET server controls. &lt;a href="http://aspadvice.com/SignUp/list.aspx?l=12&amp;c=17" target="_blank"&gt;Email List&lt;/a&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879569.aspx</link><pubDate>Tue, 28 Aug 2007 04:43:36 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879569</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879569.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879569</wfw:commentRss><description>&lt;p&gt;Yes, the Login behaves similarly to how you described; a change in the UserName and/or Password input box is not reflected in the control&amp;#39;s public properties during Page_Load. I think Login does not implement the interface because it only needs the proper name and password by its Authenticate event. That&amp;#39;s what I think, at least.&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879207.aspx</link><pubDate>Mon, 27 Aug 2007 21:17:50 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879207</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879207.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879207</wfw:commentRss><description>&lt;p&gt;Yeah, it&amp;#39;s got to be something with the control life cycle and the time at which their events are raised.&lt;/p&gt;&lt;p&gt;By examining the order in which breakpoints are hit, the first one hit on a postback is the IPostBackDataHandler.LoadPostData, in which the corresponding properties of the control are set (and I returned true to see when the change event will fire), &lt;i&gt;then&lt;/i&gt; the Page_Load, which, if the control does not set its properties using the interface, uses the &lt;b&gt;old&lt;/b&gt; postback data, and only then the RaisePostDataChangedEvent is fired, which explains why it takes two postbacks to update the viewstate property of the control if a TextChanged handler is attached to the child TextBox and modifies it.&lt;/p&gt;&lt;p&gt;I&amp;#39;ll do more studying of the behavior of Login to investigate the issue.&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879124.aspx</link><pubDate>Mon, 27 Aug 2007 20:16:05 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879124</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879124.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879124</wfw:commentRss><description>&lt;p&gt;Yeah I saw what it was doing and tried to mimic that exact functionality that way I wouldn&amp;#39;t have to implment the postbackdata handler but it wouldn&amp;#39;t work for me...&amp;nbsp; I still couldn&amp;#39;t get the value on postback until the second time it was posted... so I jsut tweaked the approach that you gave me.&amp;nbsp; I still use the postback data handler event and set the Text property in that.&amp;nbsp; although if I had my drouthers I would try to get it working without it.&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879096.aspx</link><pubDate>Mon, 27 Aug 2007 20:02:13 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879096</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879096.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879096</wfw:commentRss><description>But of course! When you use the functionality of child controls, they automatically handle the post back data. So, in the CreateChildControls() method, Login attaches handlers to TextChanged events of the username and password text boxes, and so the child text boxes handle the post back data for them, because IPostBackDataHandler.RaisePostDataChangedEvent() is called when LoadPostData(...) returns true. In a TextBox, the RaisePostDataChangedEvent() raises the TextChanged(...) event. See the disassembled CreateChildControls() method.&lt;br /&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879023.aspx</link><pubDate>Mon, 27 Aug 2007 19:14:34 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879023</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879023.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879023</wfw:commentRss><description>&lt;p&gt;Got it working it seems.&amp;nbsp; Although with a slight tweak on what you had posted.&amp;nbsp; I used this in the Postback data handler&lt;/p&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;bool&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;IPostBackDataHandler&lt;/font&gt;&lt;font size="1"&gt;.LoadPostData(&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt; postDataKey, System.Collections.Specialized.&lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;NameValueCollection&lt;/font&gt;&lt;font size="1"&gt; postCollection)&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;Text = postCollection[emailTextBox.UniqueID];&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;return&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;false&lt;/font&gt;&lt;font size="1"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;void&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;IPostBackDataHandler&lt;/font&gt;&lt;font size="1"&gt;.RaisePostDataChangedEvent() { }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="1"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;font size="1"&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;This is in Create Child controls.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="1"&gt; 
&lt;p&gt;emailTextBox.Text = (&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt;.IsNullOrEmpty(Text)) ? emailTextBox.Text : Text;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="1"&gt;I no longer override the render method as the controls know how to render themselves, this method is completely removed.&amp;nbsp; Everything seems to work. :)&amp;nbsp; Although I am curious... I decompiled the Login control that comes with .NET 2.0 and it only inherits from composite control... yet it can handle the data in pageload on postback... not sure how that is happening.&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1879021.aspx</link><pubDate>Mon, 27 Aug 2007 19:13:31 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1879021</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1879021.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1879021</wfw:commentRss><description>&lt;p&gt;Got it working it seems.&amp;nbsp; Although with a slight tweak on what you had posted.&amp;nbsp; I used this in the Postback data handler&lt;/p&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;bool&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;IPostBackDataHandler&lt;/font&gt;&lt;font size="1"&gt;.LoadPostData(&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt; postDataKey, System.Collections.Specialized.&lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;NameValueCollection&lt;/font&gt;&lt;font size="1"&gt; postCollection)&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;Text = postCollection[emailTextBox.UniqueID];&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;return&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;false&lt;/font&gt;&lt;font size="1"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;void&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;IPostBackDataHandler&lt;/font&gt;&lt;font size="1"&gt;.RaisePostDataChangedEvent() { }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="1"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;font size="1"&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;This is in Create Child controls.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="1"&gt; 
&lt;p&gt;emailTextBox.Text = (&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt;.IsNullOrEmpty(Text)) ? emailTextBox.Text : Text;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="1"&gt;I no longer override the render method as the controls know how to render themselves, this method is completely removed.&amp;nbsp; Everything seems to work. :)&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876798.aspx</link><pubDate>Sat, 25 Aug 2007 19:07:11 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876798</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876798.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876798</wfw:commentRss><description>&lt;p&gt;I also have to say that many of the issues you&amp;#39;re having are described in the book I recommended for you, &amp;quot;Pro ASP.NET 2.0 in C# 2005&amp;quot;. If you&amp;#39;re writing a custom control, or doing anything in ASP.NET, I would heavily suggest you buying it and reading at least Ch.27 (custom controls) to learn about custom controls, understand the correct way to implement composite controls (such as to store child controls&amp;#39; properties in viewstate and assign them in CreateChildControls()), and so much more about ASP.NET ...&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876796.aspx</link><pubDate>Sat, 25 Aug 2007 18:59:46 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876796</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876796.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876796</wfw:commentRss><description>&lt;p&gt;What you&amp;#39;re trying to do requires the control to load the postback data from the &amp;lt;input /&amp;gt; text tag. You must implement the IPostBackDataHandler interface.&lt;br /&gt;I have tried and tried, and finally got it to work!!!!!!&lt;/p&gt;&lt;p&gt;Anyhow, these are the changes:&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;PhoneNumberTextCtrl&lt;/span&gt;
: &lt;span&gt;CompositeControl&lt;/span&gt;, &lt;span&gt;IPostBackDataHandler&lt;/span&gt;
{&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;protected&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnInit(&lt;span&gt;EventArgs&lt;/span&gt;
e) {&lt;br /&gt;
&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;base&lt;/span&gt;.OnInit(e);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;Page.RegisterRequiresPostBack(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;protected&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Render(&lt;span&gt;HtmlTextWriter&lt;/span&gt;
writer) {&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;CreateChildControls();&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//EnsureChildControls();&lt;br /&gt;
&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;AddAttributesToRender(writer);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(phoneStyle
!= &lt;span style="color:blue;"&gt;null&lt;/span&gt;) {&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;phoneTextBox.ApplyStyle(phoneStyle);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;}&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;//Render tag manually&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&amp;nbsp; string&lt;/span&gt;
id = &lt;span&gt;&amp;quot;phoneText&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;writer.AddAttribute(&lt;span&gt;HtmlTextWriterAttribute&lt;/span&gt;.Id, id);&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;writer.AddAttribute(&lt;span&gt;HtmlTextWriterAttribute&lt;/span&gt;.Type, &lt;span&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;writer.AddAttribute(&lt;span&gt;HtmlTextWriterAttribute&lt;/span&gt;.Name, id);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//encode the
string in Text by supplying a boolean parameter which is true&lt;br /&gt;
&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;writer.AddAttribute(&lt;span&gt;HtmlTextWriterAttribute&lt;/span&gt;.Value, Text, &lt;span style="color:blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;writer.RenderBeginTag(&lt;span&gt;HtmlTextWriterTag&lt;/span&gt;.Input);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;writer.RenderEndTag();&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:green;"&gt;//phoneTextBox.RenderControl(writer);&lt;br /&gt;
&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;phoneRequired.RenderControl(writer);&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;phoneRegex.RenderControl(writer);&lt;br /&gt;
}&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;"&gt;#region&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
IPostBackDataHandler Members&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span&gt;IPostBackDataHandler&lt;/span&gt;.LoadPostData(&lt;span style="color:blue;"&gt;string&lt;/span&gt; postDataKey, System.Collections.Specialized.&lt;span&gt;NameValueCollection&lt;/span&gt; postCollection) {&lt;br /&gt;&amp;nbsp; &lt;span&gt;&lt;/span&gt;Text = postCollection[&lt;span&gt;&amp;quot;phoneText&amp;quot;&lt;/span&gt;];&lt;br /&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt;
&lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span&gt;IPostBackDataHandler&lt;/span&gt;.RaisePostDataChangedEvent()
{ }&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color:blue;"&gt;#endregion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Code Explanation:&lt;br /&gt;In the OnInit() method, let ASP.NET runtime know that you need to access the post back data; otherwise the LoadPostData() method will not be called.&lt;/p&gt;&lt;p&gt;To identify the postback data from the input control, I had to set its name attribute. Unfortunately, setting it directly on the control through phoneTextBox.Attributes[&amp;quot;name&amp;quot;] = &amp;quot;phoneText&amp;quot; didn&amp;#39;t work - it would render two name attributes...&lt;br /&gt;&lt;br /&gt;So instead of rendering the control (commented out) I rendered the input tag manually, adding all attributes as necessary. So now, the input data from the tag will be identified by the &amp;quot;phoneText&amp;quot; string. (I&amp;#39;ll suggest appending a base.UniqueID to it somewhere to ensure that no other post back data conflicts with the name)&lt;/p&gt;&lt;p&gt;Finally, in the LoadPostData method, I loaded the data from the input tag by supplying the same key I used for the name attribute, and storing the data in viewstate for latter use when rendering. (If you do use the UniqueID property, know that you can retreive it in LoadPostData with the postDataKey argument.)&lt;/p&gt;&lt;p&gt;It works perfectly for me. When the user changes the value in the input text box, the value is updated upon the next postback.&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876567.aspx</link><pubDate>Sat, 25 Aug 2007 12:17:49 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876567</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876567.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876567</wfw:commentRss><description>&lt;p&gt;&amp;nbsp;Yup... when I set the value in design time it works perfect.&amp;nbsp; However... try this... Don&amp;#39;t set the Text property at design time, Leave it blank cause assume this is something someone would fill out on a form, place the phone number control on an aspx page along with a label and a button&lt;/p&gt;&lt;p&gt;then in the button click event put in this:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string ph = PhoneNumberTextCtrl1.Text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Label1.Text = ph;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;Load the page and put in the number 123-123-1234, then press the button and postback the page... now look at the text value of the label.&amp;nbsp; It&amp;#39;s blank!&lt;br /&gt;The label won&amp;#39;t get the value of the text property.&amp;nbsp; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Now if I set the value of &amp;quot;Text&amp;quot; at design time and postback the page I can access the text property fine!&amp;nbsp;&lt;/li&gt;&lt;li&gt;If I set the &amp;quot;Text&amp;quot; property of the Phonecontrol in the Pageload for the aspx page then try to access the value on the button click event it gets it fine.&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;It &lt;u&gt;&lt;b&gt;ONLY&lt;/b&gt;&lt;/u&gt; when all values are left blank and I am trying to accept the &amp;quot;&lt;b&gt;user input&lt;/b&gt;&amp;quot; that on button click or pageload I cannot get the value the user has entered into the text control.&amp;nbsp; By the By,,, I used the code you posted for this test.&amp;nbsp; I was up till 1am trying to figure this out last night... I&amp;#39;m sure it&amp;#39;s something simple and I just can&amp;#39;t seem to find the problem. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I put a break point in the set method for the text property and it never gets called if all I do is bring up the page, enter a value and postback the page.&amp;nbsp; In the case of setting it at design time, or in the case of setting it programmatically in the page_load I hit the break point.&lt;br /&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876435.aspx</link><pubDate>Sat, 25 Aug 2007 06:01:15 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876435</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876435.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876435</wfw:commentRss><description>My response is here:&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.freewebs.com/maxtheterrible/Response1.htm" title="http://www.freewebs.com/maxtheterrible/Response1.htm" target="_blank"&gt;http://www.freewebs.com/maxtheterrible/Response1.htm&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876407.aspx</link><pubDate>Sat, 25 Aug 2007 04:47:20 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876407</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876407.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876407</wfw:commentRss><description>&lt;p&gt;That didn&amp;#39;t seem to work... matter of fact that actually reset the value to nothing on the front end.&amp;nbsp; Before that it was being carried though in the viewstate I just couldn&amp;#39;t access the method in the page load.&amp;nbsp; Funny part is I read that I don&amp;#39;t even need to override and use the render method because the controls know how to render themselves unless I want to give it special formatting.&amp;nbsp; It actually still renders fine without the method... still doesn&amp;#39;t work though.&amp;nbsp; Something is screwy with the viewstate usage because if I set the &amp;quot;Text&amp;quot; property at design time then view the page the value doesn&amp;#39;t show up when the page initially comes up, but if I just postback the page using a simple asp:button and set a label to the value of the Text property, then the label gets set fine, AND the value appears in the textbox control in the composite control on the web page.&amp;nbsp; Such strange behavior... I&amp;#39;m missing something in the way this thing renders... some order of operation.&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876278.aspx</link><pubDate>Fri, 24 Aug 2007 23:33:01 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876278</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876278.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876278</wfw:commentRss><description>&lt;p&gt;I see the problem. It&amp;#39;s that when the Render() method is called, the Text property of the &lt;i&gt;child control&lt;/i&gt; (not the one stored in ViewState) is still set to its old value. Since the properties of the child controls are assigned in CreateChildControls(), you should call CreateChildControls() the first thing in your Render() method.&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1876226.aspx</link><pubDate>Fri, 24 Aug 2007 22:07:27 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1876226</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1876226.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1876226</wfw:commentRss><description>&lt;p&gt;Now I&amp;#39;m really confused... I put everything in ViewState as you stated and it works great in design time.&amp;nbsp; I can set the required properties no problem.... however... I can&amp;#39;t get the Text property at runtime.&amp;nbsp; it comes back as blank on postback.&amp;nbsp; ie... I put the control on a page, put in a phone number, then on postback the Text property is blank...&amp;nbsp; I posted the whole control below.&amp;nbsp; Everything else is working great... if I set the required field to true&amp;nbsp;or the regex validator to true and give them messages it reacts on submit perfect... but the actual text value comes back as blank!&amp;nbsp; I was trying to figure this out for over an hour with no results.&amp;nbsp; Any ideas?&lt;/p&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Text;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Data;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Configuration;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web.Security;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web.UI;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web.UI.WebControls;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web.UI.WebControls.WebParts;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Web.UI.HtmlControls;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.ComponentModel;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;using&lt;/font&gt;&lt;font size="2"&gt; System.Security.Permissions;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;namespace&lt;/font&gt;&lt;font size="2"&gt; Controls.TextBoxes&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;font color="#008000" size="2"&gt; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;summary&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;font color="#008000" size="2"&gt; Summary description for PhoneControl&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#808080" size="2"&gt;///&lt;/font&gt;&lt;font color="#008000" size="2"&gt; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;&amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;AspNetHostingPermission&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;SecurityAction&lt;/font&gt;&lt;font size="2"&gt;.LinkDemand, &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;Level = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;AspNetHostingPermissionLevel&lt;/font&gt;&lt;font size="2"&gt;.Minimal),&lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;DefaultProperty&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Text&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ToolboxData&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;&amp;lt;{0}:PhoneNumberTextCtrl runat=\&amp;quot;server\&amp;quot;&amp;gt; &amp;lt;/{0}:PhoneNumberTextCtrl&amp;gt;&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;PhoneNumberTextCtrl&lt;/font&gt;&lt;font size="2"&gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;CompositeControl&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;TextBox&lt;/font&gt;&lt;font size="2"&gt; phoneTextBox;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;RequiredFieldValidator&lt;/font&gt;&lt;font size="2"&gt; phoneRequired;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;RegularExpressionValidator&lt;/font&gt;&lt;font size="2"&gt; phoneRegex;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Style&lt;/font&gt;&lt;font size="2"&gt; phoneStyle;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;#region&lt;/font&gt;&lt;font size="2"&gt; Properties&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Appearance&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;), &lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Phone number for textbox&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; Text&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Text&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Text&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Is this field Required?&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt; Required&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt;?)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Required&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;//object b = ViewState[&amp;quot;Required&amp;quot;];&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;//return (b == null) ? false : (bool)b;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Required&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Error Message to display if textbox is left blank&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; RequiredErrorMessage&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;RequiredErrorMessage&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;RequiredErrorMessage&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;), &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Error Message to display if textbox is left blank&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; RequiredErrorText&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;RequiredErrorText&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;RequiredErrorText&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;), &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Validation Group the control belongs to&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; ValidationGroup&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ValidationGroup&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ValidationGroup&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Is this field Required?&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt; FormatRequired&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;font size="2"&gt;?)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatRequired&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatRequired&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Text to display if the phone number is not in the correct format&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; FormatErrorMessage&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatErrorMessage&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatErrorMessage&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Text to display if the phone number is not in the correct format&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; FormatErrorText&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatErrorText&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] ?? &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.Empty;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatErrorText&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Bindable&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Behavior&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Regular expression used to format the phone number&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt; FormatExpression&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; b = ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatExpression&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;];&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt;.IsNullOrEmpty((&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)b)) ? &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;@&amp;quot;(((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4})|\d{10}|\d{7}&amp;quot;&lt;/font&gt;&lt;font size="2"&gt; : (&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;font size="2"&gt;)b;&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;//return (string)ViewState[&amp;quot;FormatExpression&amp;quot;] ?? String.Empty;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;ViewState[&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;FormatExpression&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;] = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;[&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Styles&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;DesignerSerializationVisibility&lt;/font&gt;&lt;font size="2"&gt;(&lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;DesignerSerializationVisibility&lt;/font&gt;&lt;font size="2"&gt;.Visible),&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;PersistenceMode&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;PersistenceMode&lt;/font&gt;&lt;font size="2"&gt;.InnerProperty),&lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Description&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;The strongly typed style for the TextBox child control.&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)]&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Style&lt;/font&gt;&lt;font size="2"&gt; PhoneTextBoxStyle&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (phoneStyle == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;phoneStyle = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Style&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; phoneStyle;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; PhoneNumberTextCtrl()&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;protected&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; AddParsedSubObject(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; o)&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// Declaratively specified child controls get added through this method.&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// However, the DatePicker builds its own child controls, and does not&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// want to allow the page developer to add controls, which could potentially&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// mess up the control&amp;#39;s collection.&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Exception&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Cannot add child objects declaratively.&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;protected&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; OnPreRender(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;EventArgs&lt;/font&gt;&lt;font size="2"&gt; e)&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;RenderJavaScript();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;protected&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; CreateChildControls()&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;Controls.Clear();&lt;/p&gt;phoneTextBox = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;TextBox&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;phoneTextBox.Text = Text;&lt;/p&gt;phoneTextBox.ID = &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;phoneText&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;phoneTextBox.Attributes.Add(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;onblur&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;formatPhone(this)&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;Controls.Add(phoneTextBox);&lt;/p&gt;phoneRequired = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;RequiredFieldValidator&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;phoneRequired.Enabled = Required;&lt;/p&gt;
&lt;p&gt;phoneRequired.ErrorMessage = RequiredErrorMessage;&lt;/p&gt;
&lt;p&gt;phoneRequired.Text = RequiredErrorText;&lt;/p&gt;
&lt;p&gt;phoneRequired.ValidationGroup = ValidationGroup;&lt;/p&gt;
&lt;p&gt;phoneRequired.ControlToValidate = phoneTextBox.ID;&lt;/p&gt;
&lt;p&gt;Controls.Add(phoneRequired);&lt;/p&gt;phoneRegex = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;RegularExpressionValidator&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;phoneRegex.Enabled = FormatRequired;&lt;/p&gt;
&lt;p&gt;phoneRegex.ErrorMessage = FormatErrorMessage;&lt;/p&gt;
&lt;p&gt;phoneRegex.Text = FormatErrorText;&lt;/p&gt;
&lt;p&gt;phoneRegex.ValidationGroup = ValidationGroup;&lt;/p&gt;
&lt;p&gt;phoneRegex.ControlToValidate = phoneTextBox.ID;&lt;/p&gt;
&lt;p&gt;phoneRegex.ValidationExpression = FormatExpression;&lt;/p&gt;
&lt;p&gt;Controls.Add(phoneRegex); &lt;/font&gt;&lt;font color="#008000" size="2"&gt;//&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;protected&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; Render(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlTextWriter&lt;/font&gt;&lt;font size="2"&gt; writer)&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;AddAttributesToRender(writer);&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (phoneStyle != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;phoneTextBox.ApplyStyle(phoneStyle);&lt;/p&gt;
&lt;p&gt;} &lt;/p&gt;
&lt;p&gt;phoneTextBox.RenderControl(writer);&lt;/p&gt;
&lt;p&gt;phoneRequired.RenderControl(writer);&lt;/p&gt;
&lt;p&gt;phoneRegex.RenderControl(writer);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; RenderJavaScript()&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;String&lt;/font&gt;&lt;font size="2"&gt; csname2 = &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;formatPhone&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Type&lt;/font&gt;&lt;font size="2"&gt; cstype = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;font size="2"&gt;.GetType();&lt;/p&gt;
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// Get a ClientScriptManager reference from the Page class.&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ClientScriptManager&lt;/font&gt;&lt;font size="2"&gt; cs = Page.ClientScript;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;// Check to see if the client script is already registered.&lt;/p&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (!cs.IsClientScriptBlockRegistered(cstype, csname2))&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;{&lt;/p&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;StringBuilder&lt;/font&gt;&lt;font size="2"&gt; sb = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;StringBuilder&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;&amp;lt;script type=text/javascript&amp;gt;&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;function formatPhone(phoneTextBox){\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\tvar text = phoneTextBox.value;\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\ttext = text.replace(/\\D+/g,\&amp;quot;\&amp;quot;);\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\tif(text.length == 10){\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\t\t phoneTextBox.value = \&amp;quot;(\&amp;quot; + text.substr(0,3) + \&amp;quot;) \&amp;quot; + text.substr(3,3) + \&amp;quot;-\&amp;quot; + text.substr(6,4);\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\t}\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\tif(text.length == 7){\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\t\t phoneTextBox.value = text.substr(0,3) + \&amp;quot;-\&amp;quot; + text.substr(3,4);\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;\t}\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;}\r\n&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;sb.Append(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;&amp;lt;/script&amp;gt;&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;cs.RegisterClientScriptBlock(cstype, csname2, sb.ToString(), &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;&lt;/font&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1875800.aspx</link><pubDate>Fri, 24 Aug 2007 17:07:49 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1875800</guid><dc:creator>Max Kukartsev</dc:creator><author>Max Kukartsev</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1875800.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1875800</wfw:commentRss><description>&lt;p&gt;Well, there are several books. A good book on simply C# (not specific to ASP.NET but has a little ASP.NET at the end) is &amp;quot;Pro C# 2005 and the .NET 2.0 Platform&amp;quot; by Andrew Troelsen (&lt;a href="http://apress.com/book/bookDisplay.html?bID=390" title="http://apress.com/book/bookDisplay.html?bID=390"&gt;http://apress.com/book/bookDisplay.html?bID=390&lt;/a&gt;), which actually has a newer edition (&amp;quot;Pro C# with .NET 3.0, Special Edition&amp;quot;). A specialized book on ASP.NET 2.0, and has a chapter on user controls, one on custom controls, and one about design-time support is &amp;quot;Pro ASP.NET in C# 2005, Special Edition&amp;quot; (&lt;a href="http://apress.com/book/bookDisplay.html?bID=10195" title="http://apress.com/book/bookDisplay.html?bID=10195" target="_blank"&gt;http://apress.com/book/bookDisplay.html?bID=10195&lt;/a&gt;) SE includes an extra chapter or two devoted to AJAX and client-side script behavior. That is the book which is useful for learning object models, and it&amp;#39;s actually where I read to assign property values to child controls in CreateChildControls(), not directly and other stuff.&lt;br /&gt;The problem is, any books devoted to ASP.NET control development are for .NET 1.x. But come to think of it, the book &amp;quot;Pro ASP.NET in C# 2005&amp;quot; largely focuses on the various improvements in ASP.NET 2.0, and so to supplement it with one of the dedicated ASP.NET control development books would be sufficient. The frustrations I&amp;#39;ve encountered with the older books is that a some amount of their code is obsolete. But I&amp;#39;m sure once you look into MSDN it&amp;#39;ll show you the &amp;quot;non-obsolete&amp;quot; alternative.&lt;br /&gt;Two dedicated books on ASP.NET controls are &amp;quot;Building ASP.NET Server Controls&amp;quot; (&lt;a href="http://apress.com/book/bookDisplay.html?bID=262" title="http://apress.com/book/bookDisplay.html?bID=262" target="_blank"&gt;http://apress.com/book/bookDisplay.html?bID=262&lt;/a&gt;) and &amp;quot;Developing Microsoft ASP.NET Server Controls and Components&amp;quot; (&lt;a href="http://www.microsoft.com/MSPress/books/5728.aspx" title="http://www.microsoft.com/MSPress/books/5728.aspx" target="_blank"&gt;http://www.microsoft.com/MSPress/books/5728.aspx&lt;/a&gt;).&lt;br /&gt;------------------&lt;br /&gt;Easy! If you want to hide a control from the toolbox, just decorate it with the ToolBoxItemAttribute(false), which also prevents it from appearing in ASPX intellisense (a drop-down list of available controls when you start typing). However, the user will still be able to instantiate it programmatically, so I&amp;#39;d also suggest making the constructor non-public, if you haven&amp;#39;t done so already...&lt;/p&gt;&lt;p&gt;Hope I was of assistance...&lt;/p&gt;</description></item><item><title>Re: CompositeControl properties not reflected in Property window</title><link>http://forums.asp.net/thread/1875371.aspx</link><pubDate>Fri, 24 Aug 2007 13:36:55 GMT</pubDate><guid isPermaLink="false">4c671506-2930-414c-a40b-8bf57ded5924:1875371</guid><dc:creator>Rab815</dc:creator><author>Rab815</author><slash:comments>0</slash:comments><comments>http://forums.asp.net/thread/1875371.aspx</comments><wfw:commentRss>http://forums.asp.net/commentrss.aspx?SectionID=19&amp;PostID=1875371</wfw:commentRss><description>&lt;p&gt;Ahhh, I keep forgetting about those newer nullable types for &lt;em&gt;value types&lt;/em&gt;.&amp;nbsp; I did discover through trial and error that any property having a defined defaultvalueattribute would not be serialized to the asp.net code in design time if it was set to that default value.&amp;nbsp; Would you recommend any good books on server/composite control development.&amp;nbsp; I&amp;#39;d like to learn more about this stuff.&amp;nbsp; Things like this &lt;span id="nsrTitle"&gt;PropertyDescriptor.ShouldSerializeValue attribute is news to me.&amp;nbsp; I&amp;#39;m sure there are many of those that would make life easier.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;Also as far as inheritance goes...&amp;nbsp; I did try something because most of the basics on my control library will be similar, ie... many of the text box controls will have a required field validator, and a regex validator so I was thinking about putting them in a base class which itself inherits from CompositeControl, then extend that base class to say (phonenumbertxtctrl,emailtxtctrl etc...)&amp;nbsp; However when I did that and tried adding it to the toolbox the baseclass was added to the tool box as well.. is there a way to eliminate that behavior.&amp;nbsp; It&amp;#39;s either that or I build the base class to be used as a generic control to be used by itself, then extend it properly to become more specific for phone numbers and emails etc...&lt;/span&gt;&lt;/p&gt;</description></item></channel></rss>