当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET动态创建控件之绝境求生

ASP.NET
不同映射模式下的直线输出的效果问题
ASP.NET开发下的MVC设计模式的实现
ASP.NET编写应用程序的十大技巧
ASP.NET中使用AJAX的简单方法
ASP.NET MVC实现自己的视图引擎
认识asp.net会话状态
ASP.NET实现页面传值的几种方法
.NET中容易混淆的几组重要概念
详解.NET中的动态编译技术
如何使用ASP.Net加密Cookie
ASP.NET 2.0跨网页提交的三种方法
ASP.NET 2.0创建母版页引来的麻烦
.Net整合其他平台的一些探讨
ASP.NET编程经验技巧10则
最佳实践 ADO.NET实用经验无保留曝光
在.NET上执行多线程操作要考虑的两大因素
.Net开发 细说Visual Basic.Net
ASP.NET网络编程中经常用到的27个函数集
ASP.NET防止用户多次登录的方法
对ASP.NET MVC项目中的视图做单元测试

ASP.NET动态创建控件之绝境求生


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 103 ::
收藏到网摘: n/a

    在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵!
  
  要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone!
  提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常!
  
  大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于OnInit阶段,而且ViewState在OnLoad时才准备好,OnInit以及之前的阶段根本就不能使用ViewState!如果试图在按钮点击事件里面创建WebPartZone等控件,唯一的后果就是页面出错;而如果在OnInit里面创建控件,由于ViewState没有准备好,那么有些数据比如当前需要创建的个数(存在ViewState里面)就无法获得!
  
  目前对这个问题我还没有找到什么好的解决方案,经过实验,勉强得出一个不怎么优雅的方案,就是利用HiddenField保存数据,然后直接使用Request.Form["XXX"]在OnInit阶段取得数据;而判断是否点击按钮也是通过Request.Form是否存在对应数据来判断的!废话不多说了,大家看看代码吧!
  
  
  
  <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
  
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head runat="server">
   <title>Untitled Page</title>
  </head>
  <body>
   <form id="form1" runat="server">
   <asp:ScriptManager ID="ScriptManager1" runat="server" />
   <div>
   <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
   <br />
   <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> 
   <asp:HiddenField ID="hfCount" runat="server" Value="0" />
   </div>
   </form>
  </body>
  </html>
  
  using System;
  using System.Data;
  using System.Configuration;
  using System.Web;
  using System.Web.Security;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;
  using System.Web.UI.HtmlControls;
  
  public partial class _Default : System.Web.UI.Page
  {
   private int _count = 0;
  
   protected override void OnInit(EventArgs e)
   {
   base.OnInit(e);
  
   // 取得以前已创建控件的个数
   if (!String.IsNullOrEmpty(this.Request["hfCount"]))
   {
   _count = Convert.ToInt32(this.Request["hfCount"]);
   }
  
   // 假如按下“Add”按钮,那么count加一
   string target = this.Request["btnAdd"];
   if (target == "Add")
   {
   _count++;
   }
  
   // 动态创建控件
   for (int i = 0; i < _count; i++)
   { // 这里以TextBox为例,实际上需要创建的是WebPartZone
   TextBox newTextbox = new TextBox();
   newTextbox.ID = "TXT" + i.ToString();
   this.PlaceHolder1.Controls.Add(newTextbox);
   }
   }
  
   protected void Page_Load(object sender, EventArgs e)
   {
   hfCount.Value = _count.ToString();
   }
  
   protected void btnAdd_Click(object sender, EventArgs e)
   {
   // 不