冷枫@CSDN

CSharp程序员大本营:积累平凡就是积累卓越!有了翅膀,你就有了天空!钝到极点的刀才最具杀伤力——因为它是锤子!

用户操作
[即时聊天] [发私信] [加为好友]
宋巍巍ID:JavaProgramers
483351次访问,排名98好友111人,关注者141
毕业于南阳理工学院计算机系软件工程专业,一直从事于软件开发工作,编程经验5年,一线程序员出身,开发实战经验丰富,精通Asp,Asp.NET, ERP(C#.NET),基于WEB(Asp.Net)的MIS等世道上的一般编程,精通SQL Server存储过程开发,曾为一家中型商务企业软件开发工程师,软件培训师。
JavaProgramers的文章
原创 287 篇
翻译 0 篇
转载 24 篇
评论 441 篇
╄ 冷枫的公告
╄ 冷枫 Asp.NET微软MVP
本Blog技术支持QQ群
[NET技术联盟]:1908832
[冷枫开发小组]:6307410
CSharp开放源码促进会
CSharp程序员大本营
最近评论
反对垄断:现在都在卖服务,软件都是白送的,微软降到100多就想笼络人心,做梦,微软迟早要完蛋
wyw_2002:“中国用户的计算机中60%都运行微软的操作系统“

请问这个60%是你统计的吗?
那40%是什么系统?

捡瓶子:废瓶子1角钱一个,一天捡100个,10元,跑去吃饭8元,买个XP,也要捡2年啊!
zenggang2008:反击盗版,在中国还有很长的路要走啊
大家都已经习惯"免费"了
路过:盗版不利于中国的软件业的发展,最终用户好像在盗版软件中得到了很多的好处,但是把中国的软件产业搞垮了。最终用户最后还是受害者。
文章分类
收藏
    相册
    IT英雄传奇
    大学留念集
    公司一角
    旅游系列二
    旅游系列三
    旅游系列一
    [╄ 冷枫]简介
    站长简介(RSS)
    经典网站收集
    .NET分页存储过程
    AJAX中国
    DOTNET控件网
    DotNet男孩社区
    Java共舞
    Tutorails[.NET]
    中国盟动力
    冷枫技术论坛
    开发者在线
    技术无极限(RSS)
    深圳赶集网
    源码网
    软件项目网
    网上邻居
    『 天道酬勤 』(RSS)
    『 孟子E章 』(RSS)
    『 孟子E章 』
    『 邹建专栏 』(RSS)
    『webdiyer 』
    微软官方
    ASP.NET 入门教程
    webcast视频教程
    存档
    订阅我的博客
    XML聚合  FeedSky

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

    新一篇: asp.net ajax 使用updatepanel进行更新后的提示 | 旧一篇: SOA不是Web Service,Web Service是目前最适合实现SOA的技术

    在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)
       {
       // 不能在此添加WebPartZone控件,只能在OnInit或之前,否则报异常
       }
      } 
     

    发表于 @ 2007年04月26日 12:08:00|评论(loading...)|编辑

    新一篇: asp.net ajax 使用updatepanel进行更新后的提示 | 旧一篇: SOA不是Web Service,Web Service是目前最适合实现SOA的技术

    评论

    #FM9T 发表于2007-04-27 10:12:17  IP: 13.187.1.*
    兄弟,不对啊,我直接在Add里面也可以创建控件啊。我用的是.net 2.0环境,代码如下:
    //页面部分
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddTextBox.aspx.cs" Inherits="AddTextBox" %>

    <!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 runat="server">
    <title>Untitled Page</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="TxtNum" runat="server"></asp:TextBox>
    <asp:Button ID="BtnAcc" runat="server" Text="Add" OnClick="BtnAcc_Click" /><br />
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

    </div>
    </form>
    </body>
    </html>

    //Code部分
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    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 AddTextBox : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void BtnAcc_Click(object sender, EventArgs e)
    #FM9T 发表于2007-04-27 10:13:27  IP: 13.187.1.*
    {
    if (this.TxtNum.Text != "")
    {
    int num = int.Parse(this.TxtNum.Text);
    for (int i = 0; i < num; i++)
    {
    TextBox t = new TextBox();
    t.ID = "Txt" + i.ToString();
    this.PlaceHolder1.Controls.Add(t);
    }
    }
    }
    }


    刚才字数超出了
    #FM9T 发表于2007-04-27 10:15:41  IP: 13.187.1.*
    不好意思,是我把你的意思理解错了,TextBox可以在Button的Click事件里创建,但WebPartZone是不行的。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © ╄ 冷枫