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


    文章转载至:  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
  • 相关阅读:
    java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    ElasticSearch读取查询结果(search)
    Oracle合并某一列
    Django在Eclipse下配置启动端口号
    Apache部署django项目
    Apache的下载安装(主要说的 64位)及问题
    windows7下怎样安装whl文件(python)
    windows下面安装Python和pip终极教程
    Java 多线程 并发编程 (转)
    数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
  • 原文地址:https://www.cnblogs.com/jsonzheng/p/1938403.html
Copyright © 2020-2023  润新知