• 控件包含代码块,因此无法修改控件集合


    文章转载至:  http://www.olnote.com/itlife/note/100000003.aspx
    控件包含代码块(即<% ... %>),因此无法修改控件集合。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Web.HttpException: 控件包含代码块(即 <% ... %> ),因此无法修改控件集合。
    一、错误例子解说:
    <asp:Panel ID="p_Time" runat="server">
       <%= DateTime.Now.ToString("HH-mm")%>
    </asp:Panel>

    Label lb=new Label();
    lb.Text = "当前时间";
    p_Time.Controls.Add(lb);
    以上代码执行的时候,将会产生该错误。由于p_Time控件中包含了代码块(即<% ... %>),无法修改控件集合,所以当执行语句p_Time.Controls.Add(lb)时会产生错误。
    二、通常出错的地方以及解决方案
    通常在页面代码的head部分的javascript代码中通过<%=this.control.ClientID%>来获取服务器控件标识符(代码如下所示)等,当应用主题等功能的时候,服务器脚本会向Header动态添加控件,而引发错误。
    <html xmlns="http://www.w3.org/1999/xhtml">
       <head runat="server">
          <script type="text/javascript">
          function showTime()
          {
             var now = new Date();
             var lbTime = document.getElementById('<%= this.lb_Time.ClientID %>');
             lbTime.innerHTML = now.getHours() + ":" + now.getMinutes();
          }
          </script>
       </head>
       <body>
          <asp:Label ID="lb_Time" runat="server" Text="lb_Time"></asp:Label>
          <input id="btn_Show" type="button" value="button" onclick="return showTime()" />
       </body>
    </html>
    

    解决方案如下:
    1、把javascript放到body中
    2、声明自定义控件来代替包含了代码块(即<% ... %>)
    控件代码:
    public class ControlInfoWriter : Control
    {
       private string writerControlID;
       private string writerProperty;
    
       public string WriterControlID
       {
           get { return writerControlID; }
           set { writerControlID = value; }
       }
    
       public string WriterProperty
       {
           get { return writerProperty; }
           set { writerProperty = value; }
       }
    
       protected override void Render(System.Web.UI.HtmlTextWriter writer)
       {
           object writerControl = this.Parent.FindControl(writerControlID);//查找要输出的控件
           Type t = writerControl.GetType();//获取控件的类型
           PropertyInfo pi = t.GetProperty(writerProperty);//获取要输出的属性
           string value = pi.GetValue(writerControl, null).ToString();//得到控件的属性值
           writer.Write(value);
           base.Render(writer);
       }
    }
    

    head中的javascript修改如下:
    <script type="text/javascript">
    function showTime()
    {
       var now = new Date();
       var lbTime = document.getElementById('<CustomControl:ControlInfoWriter ID="controlInfoWriter" WriterControlID="lb_Time" WriterProperty="ClientID" runat="server" />');
       lbTime.innerHTML = now.getHours() + ":" + now.getMinutes();
    }
    </script>
    

    注:页面代码中要注册控件CustomControl:ControlInfoWriter
  • 相关阅读:
    踏实每一个脚印——2019年12月复盘
    修改博客园markdown编辑器代码高亮风格的方法
    Hyperion: Building the Largest In memory Search Tree
    C++11——智能指针
    拷贝控制
    分布式系统常见概念
    extern和static使用
    APUE—UNIX文件系统
    C++的一些细节
    fork和僵尸进程
  • 原文地址:https://www.cnblogs.com/jsonzheng/p/1938403.html
Copyright © 2020-2023  润新知