Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / General / April 2008

Tip: Looking for answers? Try searching our database.

The Controls collection cannot be modified because the control     contains code blocks

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Radu - 16 Apr 2008 15:13 GMT
Hi. I am trying to localize a page AND simulate the AJAX watermarks in
it, i.e. the textbox contains the text "Enter your name", or "Entrez
votre nom", for instance, then on click, delete this text, allow
entry, but on deletion of the inputted text show again "Enter your
name", or "Entrez votre nom" depending on the UICulture.

Everything worked great UNTIL I have added a button which posts back.
Now on postback I have the error in the title.

This is how it is supposed to work. The page contains the script
<script>
    var s=trim('<%= jsTextAddress %>');

    function trim(stringToTrim) {
        return stringToTrim.replace(/^\s+|\s+$/g,"");
    }

    function RecipientAddress_SetToBlank(){
        var t=trim(event.srcElement.value)
        if (t == s)
        {
            event.srcElement.value = "";
        }
    }

    function RecipientAddress_SetToDefault(){
        var t=trim(event.srcElement.value)
        if (t == "")
        {
            event.srcElement.value = s;
        }
    }
</script>

The "trim" function is necessary because (first stupid unexplained
thing) the clean strings entered in the resource files come back with
lots of Tabs, CRLFs, and spaces (!!!!!!!!?????)

The textarea in question has the HTML
    onfocus="RecipientAddress_SetToBlank()"
    onblur="RecipientAddress_SetToDefault()"

The whole thing is supposed to compare the existing string in the
textbox control with the "LOCALIZED" default contents, that is "Enter
your name" or "Entrez votre nom". That's why I need to use the
variable <%= jsTextAddress %> instead of comparing it directly with
the "Enter your name" string.

In code behind, in Page Load, I have
jsTextAddress = GetGlobalResourceObject("Scorecards", "String1")

It all worked great - on load the text area showed either "Enter your
name" or "Entrez votre nom", when cliking in the textarea it became
blank waiting for input, if input than the input stays, if the input
is deleted then the contents reverts to either "Enter your name" or
"Entrez votre nom" depending on the culture - exactly as a watermarked
text control is supposed to work.

However, as soon as I have added a postback control on the page, I
have started to receive the error "The Controls collection cannot be
modified because the control contains code blocks" which happens on
System.Web.UI.ControlCollection.Add(Control child)

How can I fix this please ?
Thanks a lot. Alex.

PS. This is the code for quick pasting in a form named "Welcome.aspx":
HTML:

-----------------------------------------------------------------------------------------------------------------------------------------
<%@ Page Language="vb" AutoEventWireup="false"
CodeBehind="Welcome.aspx.vb" Inherits="Temp2.Welcome" %>
<!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 id="Head1" runat="server">
   <title>Welcome</title>
   <script>
        var s=trim('<%= jsTextAddress %>');

        function trim(stringToTrim) {
            return stringToTrim.replace(/^\s+|\s+$/g,"");
        }

        function RecipientAddress_SetToBlank(){
            var t=trim(event.srcElement.value)
            if (t == s)
            {
                event.srcElement.value = "";
            }
        }

        function RecipientAddress_SetToDefault(){
            var t=trim(event.srcElement.value)
            if (t == "")
            {
                event.srcElement.value = s;
            }
        }
    </script>
</head>

<body>
   <form id="frmWelcome" runat="server">
   <div>
        <textarea
            title="<%$ Resources:Scorecards, String2 %>"
            rows="5"
            id="txtRecipient_Address"
            style="width:100%;"
            onfocus="RecipientAddress_SetToBlank()"
            onblur="RecipientAddress_SetToDefault()"
            runat="server">
            <%= jsTextAddress %>
        </textarea>

        <asp:RequiredFieldValidator
            ID="req_txtRecipient_Address1"
            Display="Dynamic"
            ControlToValidate="txtRecipient_Address"
            Text="*"
            InitialValue="<%= jsTextAddress %>"
            ErrorMessage="<%$ Resources:Scorecards, String5 %>"
            runat="server">
        </asp:RequiredFieldValidator>

        <asp:RequiredFieldValidator
            ID="req_txtRecipient_Address2"
            Display="Dynamic"
            ControlToValidate="txtRecipient_Address"
            Text="*"
            ErrorMessage="<%$ Resources:Scorecards, String5 %>"
            runat="server">
        </asp:RequiredFieldValidator>

        <asp:ValidationSummary
            ID="validSummary"
            ShowSummary="false"
            DisplayMode="BulletList"
            HeaderText="<%$ Resources:Scorecards, String4 %>"
            ShowMessageBox="true"
            runat="server"
        />

        <input
            type="text"
            id="txtRecipientSummary"
            value="<%$ Resources:Scorecards, String6%> "
            runat="server"
            title="<%$ Resources:Scorecards, String6%> "
            style="width:100%"
        />

        <asp:Button
            Width="150"
            AccessKey="N"
            Text="<%$ Resources:Scorecards, String7 %>"
            ID="cmdOk"
            runat="server"
        />
   </div>
   </form>
</body>
</html>

Code-behind:
-----------------------------------------------------------------------------------------------------------------------------------------
Public Partial Class Welcome
    Inherits System.Web.UI.Page

    Public jsTextAddress As String

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load

        jsTextAddress = GetGlobalResourceObject("Scorecards", "String1")
    End Sub

    Protected Overrides Sub InitializeCulture()

        Dim strLang As String

        strLang = Context.Request.Params("Language")
        If Not String.IsNullOrEmpty(strLang) Then
            If UCase(strLang) = "FR-CA" Then
                UICulture = strLang
                Culture = strLang
                Session("Language") = "FR-CA"
                System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture(strLang)
                System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo(strLang)
            Else 'Default to language "en"
                UICulture = "EN-CA"
                Culture = "EN-CA"
                Session("Language") = "EN-CA"
                System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-CA")
                System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo("en-CA")
            End If
        End If
    End Sub
End Class
Radu - 16 Apr 2008 15:59 GMT
I have "solved" the problem... I don't understand why it's solved, the
only thing I did was to take out the inital population of the textbox
"txtRecipient_Address" from the HTML and add it to the code-behind,
like so:

HTML:
--------------------------------------------------------------------------------------------------------------
<%@ Page Language="vb" AutoEventWireup="false"
CodeBehind="Welcome.aspx.vb" Inherits="Temp2.Welcome" %>
<!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 id="Head1" runat="server">
   <title>Welcome</title>
   <script>
        var s=trim('<%= jsTextAddress %>');

        function trim(stringToTrim) {
            return stringToTrim.replace(/^\s+|\s+$/g,"");
        }

        function RecipientAddress_SetToBlank(){
            var t=trim(event.srcElement.value)
            if (t == s)
            {
                event.srcElement.value = "";
            }
        }

        function RecipientAddress_SetToDefault(){
            var t=trim(event.srcElement.value)
            if (t == "")
            {
                event.srcElement.value = s;
            }
        }
    </script>
</head>

<body>
   <form id="frmWelcome" runat="server">
   <div>
        <textarea
            title="<%$ Resources:Scorecards, String2 %>"
            rows="5"
            id="txtRecipient_Address"
            style="width:100%;"
            onfocus="RecipientAddress_SetToBlank()"
            onblur="RecipientAddress_SetToDefault()"
            runat="server">
        </textarea>

        <asp:RequiredFieldValidator
            ID="req_txtRecipient_Address1"
            Display="Dynamic"
            ControlToValidate="txtRecipient_Address"
            Text="*"
            InitialValue="<%= jsTextAddress %>"
            ErrorMessage="<%$ Resources:Scorecards, String5 %>"
            runat="server">
        </asp:RequiredFieldValidator>

        <input
            type="text"
            id="txtRecipientSummary"
            value="<%$ Resources:Scorecards, String6%> "
            runat="server"
            title="<%$ Resources:Scorecards, String6%> "
            style="width:100%"
        />

        <br />

        <asp:Button
            Width="150"
            AccessKey="N"
            Text="<%$ Resources:Scorecards, String7 %>"
            ID="cmdOk"
            runat="server"
        />

        <asp:ValidationSummary
            ID="validSummary"
            ShowSummary="false"
            DisplayMode="BulletList"
            HeaderText="<%$ Resources:Scorecards, String4 %>"
            ShowMessageBox="true"
            runat="server"
        />
   </div>
   </form>
</body>
</html>

Code behind:
--------------------------------------------------------------------------------------------------------------
Public Partial Class Welcome
    Inherits System.Web.UI.Page

    Public jsTextAddress As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load

        jsTextAddress = Trim(GetGlobalResourceObject("Scorecards",
"String1"))
        If Not Page.IsPostBack Then
            txtRecipient_Address.Value = jsTextAddress
        End If
    End Sub

    Protected Overrides Sub InitializeCulture()

        Dim strLang As String

        strLang = Context.Request.Params("Language")
        If Not String.IsNullOrEmpty(strLang) Then
            If UCase(strLang) = "FR-CA" Then
                UICulture = strLang
                Culture = strLang
                Session("Language") = "FR-CA"
                System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture(strLang)
                System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo(strLang)
            Else 'Default to language "en"
                UICulture = "EN-CA"
                Culture = "EN-CA"
                Session("Language") = "EN-CA"
                System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-CA")
                System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo("en-CA")
            End If
        End If
    End Sub

    Private Sub cmdOk_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdOk.Click

        Dim objStringBuilder As StringBuilder = New StringBuilder
        Dim strMsg As String

        objStringBuilder.Append("<script language='javascript'>")

        strMsg = "The values of the controls on this page are:"
        strMsg = strMsg & "\n" & txtRecipient_Address.Value
        strMsg = strMsg & "\n" & txtRecipientSummary.Value
        objStringBuilder.Append("alert( """ + strMsg + """ );")

        objStringBuilder.Append("</script>")
        ClientScript.RegisterClientScriptBlock(Me.GetType, "Alert",
objStringBuilder.ToString)
    End Sub
End Class
--------------------------------------------------------------------------------------------------------------

Thanks for reading.
Alex.

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.