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

原文 http://www.cnblogs.com/jsonzheng/archive/2011/01/18/1938403.html

控件包含代码块(即<% ... %>),因此无法修改控件集合。
说明: 执行当前 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

作者:郑某人
出处:http://jsonzheng.cnblogs.com
欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能推荐或关注

时间: 2024-08-02 08:03:29

控件包含代码块,因此无法修改控件集合的相关文章

一个简单的JS时间控件示例代码(JS时分秒时间控件)_javascript技巧

自己在网上找了半天没找到只有 "时分秒"的控件, 就自己做了个,发在这里方便有人用到 鼠标点击 后 的效果 SetTime.js 复制代码 代码如下: /**//************************************ 使用说明:* 首先把本控件包含到页面 * <script src="XXX/setTime.js" type="text/javascript"></script>* 控件调用函数:_Set

【springmvc+mybatis项目实战】杰信商贸-33.出口报运修改+报运货物批量展现-批量修改控件2

具体批量修改的几个要点: 1)批量展示 mrecord控件(自定义) 也就是在html界面上的table表格中添加新的行,这个时候我们使用javascript来实现这种效果就行了,innerHTML 实现往一个区域div增加一段html代码,table,tr,td都用利用js动态插入.这里我们使用控件来完成. 下面我们来实现 我们来修改我们的jExportupdate.jsp,在修改出口报运信息下添加报运下货物的列表信息,并且将需要添加的货物列表添加上去,并且将动态表格的js文件和javascr

Xcode 修改系统的代码块样式 Code Snippet

Xcode在编码的时候,系统代码块给我们提供了很大的便利.然而,有时候,也给我们带来很大的困扰. 例如,系统的 if 代码块,大括号是紧跟括号之后的.   但是现在呢,公司的代码规范是要求另起一行.  那每次都得手动去调,的确是件很影响心情的事. 现在,就教大家怎么去修改系统的代码块样式. Xcode内置代码模板 Xcode的所有代码模板是用一个plist格式xml文件描述的,这文件存储在Xcode的安装目录:  /Applications/Xcode.app/Contents/Framewor

VB6.0控件通过代码改变它的属性的方法

问题描述 VB6.0控件通过代码改变它的属性的方法 VB6.0 控件通过代码改变它的属性,而这个属性是不能通过界面设计来更改的! 解决方案 这个你可以直接在代码中用控件名.属性的方法修改.很简单啊.

VC++如何在程序中用代码注册和卸载ocx控件(代码)

方法一:在dos或Windows命令行下运行:regsvr32 ocxname.ocx 注册 示例:regsvr32 netshare.ocx     //注册netshare.ocx控件regsvr32 /u netshare.ocx    //解除netshare.ocx控件的注册 如果netshare.ocx文件不在system目录时,还必须在文件名前加上完整的路径.除了regsvr32应用程序之外,Microsoft在它的 web 站点上还提供了一个称为regclean.exe 的程序,

asp.net中使用自定义控件的方式实现一个分页控件的代码_实用技巧

一.概述 在web开发中,常常需要显示一些数据,而为了方便排版及浏览,我们只需要显示所有记录中的一部分.一般情况下,我们采用分页来实现这个需求.实现分页的方法多种多样,在本文中,我们采用了一个分页空间来记录记录总数.当前页.总页数及页面大小等.为了有一个直观上的印象,先展示该控件运行后的效果,效果如下图所示: 二.实现方案 为了实现该效果图,在asp.net中,可以使用Custom Controls and User Controls两种方式,User Controls的实现方式及其简单,而且使

android:在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件?

问题描述 android:在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件? 如题,在Activity如何写一种方法,当调用时可以永久的向原来的布局中增添或修改控件? 解决方案 不明白干嘛,添加控件,无非就是先创建或渲染出一个view,然后通过addview加入到指定的容器中 解决方案二: 可控的话 先写在xml中设visible为gone. 需要的时候设置为visible 解决方案三: 不太清楚你的意思.如果就是添加界面的话,可以用两种方法,一种是楼上说的,可以

asp.net动态加载用户控件,关于后台添加、修改的思考_实用技巧

看下下面这个典型的后台(比较粗糙):说实在,我很厌倦全部用.aspx文件去做,比如"友情连接"这个模块,就有"添加友情连接""修改友情连接""友情连接列表",简单的话,可以把"添加""修改"合成一个文件.每次都去建立一个.aspx文件.我现在的想法是用"用户控件+配置文件"去实现,虽然文件数目可能不会少很多.但在编程到一定地步,我想大家会有跟我一样的想法. 首先需要涉

C# ComboBox控件“设置 DataSource 属性后无法修改项集合”的完美解决方法_C#教程

由于毕业后工作没有对接到专业问题,导致四五年没有碰过Winform程序了.突然由于工作问题,为了方便自己,所以想自己写写小winform小软件,用于自己使用.在使用ComboBox控件时,遇到了重新绑定赋值出问题的情况. 错误代码如下: if (CustomerBLL.select().Rows.Count > 0) { cbTcid.Items.Clear(); cbTcid.DataSource = CustomerBLL.select(); cbTcid.ValueMember = "