CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

○○○急!关于动态添加控件问题,详情进!○○○

楼主SuperW(精品烂人)2004-08-02 08:56:50 在 .NET技术 / ASP.NET 提问

目前动态添加已完成了,  
  只是动态添加的TextBox控件名称无法在程序中使用如何办?  
  如,我动态添加的TextBox控件ID是txt_1,由于是动态添加的  
  当程序运行时并没有ID是txt_1的TextBox就会报错,   在程序中怎么使用?  
  源码如下:  
   
  static   int   iCount;//定义的静态变量  
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
   
  if(!IsPostBack)  
  {  
  iCount=0;  
  }  
  else  
  {  
  CreatedControls(iCount);  
  }  
   
   
  }  
   
  #region   Web   窗体设计器生成的代码  
  override   protected   void   OnInit(EventArgs   e)  
  {  
  //  
  //   CODEGEN:   该调用是   ASP.NET   Web   窗体设计器所必需的。  
  //  
  InitializeComponent();  
  base.OnInit(e);  
  }  
   
  ///   <summary>  
  ///   设计器支持所需的方法   -   不要使用代码编辑器修改  
  ///   此方法的内容。  
  ///   </summary>  
  private   void   InitializeComponent()  
  {          
  this.Button1.Click   +=   new   System.EventHandler(this.Button1_Click);  
  this.Load   +=   new   System.EventHandler(this.Page_Load);  
   
  }  
  #endregion  
   
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  iCount=iCount+1;  
   
  }  
   
  void   CreatedControls(int   count)  
  {  
  TextBox   txt;  
  Button   btn;  
  Label   lbl;  
   
  TextBox   txt1;  
  Button   btn1;  
  Label   lbl1;  
   
  for(int   i=0;i<count;i++)  
  {  
  lbl=new   Label();  
  txt=new   TextBox();  
  btn=new   Button();  
   
   
  lbl.ID   ="lbl_"+(i+1).ToString();  
  lbl.Text="新增附件";  
  txt.ID   =   "txt_"+(i+1).ToString();  
  txt.Text=txt.ID;  
   
  btn.ID   =   "btn_"+(i+1).ToString();  
  btn.Text="浏览文件";  
   
  this.Panel1.Controls.Add(lbl);  
  this.Panel1.Controls.Add(txt);  
  this.Panel1.Controls.Add(btn);    
  btn.Click   +=   new   System.EventHandler(btn_Click);    
   
  lbl1=new   Label();  
  txt1=new   TextBox();  
  btn1=new   Button();  
   
  lbl1.ID   ="lbl1_"+(i+1).ToString();  
  lbl1.Text="附件标题";  
  txt1.ID   =   "txt1_"+(i+1).ToString();  
  btn1.ID   =   "btn1_"+(i+1).ToString();  
  btn1.Text="删除本条";  
   
  this.Panel1.Controls.Add(lbl1);  
  this.Panel1.Controls.Add(txt1);  
  this.Panel1.Controls.Add(btn1);    
  btn1.Click   +=   new   System.EventHandler(btn1_Click);  
   
  }  
  }  
  private   void   btn_Click(object   sender,   System.EventArgs   e)  
  {  
  }  
  private   void   btn1_Click(object   sender,   System.EventArgs   e)  
  {  
   
   
  } 问题点数:60、回复次数:15Top

1 楼KevinCao(我老婆很小(猥琐是一种境界)(散会中...)(不是散会,是散分中...))回复于 2004-08-02 09:01:25 得分 2

楼主拜托你重新上一下语文科  
  还有你贴这么多代码谁去看啊,你把关键的语句写出来就可以了Top

2 楼SuperW(精品烂人)回复于 2004-08-02 09:16:37 得分 0

To:KevinCao   ,训的好!  
  如,我动态添加的TextBox控件ID是txt_1,由于是动态添加的  
  当程序运行时并没有ID是txt_1的TextBox就会报错,   在程序中怎么引用?  
   
  使用txt_1.Text="XXX"会报错.Top

3 楼wnlovezxm(大垃圾人)回复于 2004-08-02 09:33:05 得分 2

if   (this.Page.Controls.FindControl("txt_1")!=null)  
  {  
  txt_1.Text   =   "asdfasdf";  
  }  
  Top

4 楼loveerror(马烁焱)回复于 2004-08-02 09:36:20 得分 4

遍历this.Panel1.Controls中的所有控件,查找ID为txt_1的控件就是了.Top

5 楼SuperW(精品烂人)回复于 2004-08-02 09:54:30 得分 0

to:wnlovezxm(大垃圾人)  
  txt_1.text="xxx"  
  刚载页面时还没有txt_1呀,会出错的。Top

6 楼brightheroes(在地狱中仰望天堂)回复于 2004-08-02 09:59:27 得分 2

你要用FindControl  
   
  Top

7 楼brightheroes(在地狱中仰望天堂)回复于 2004-08-02 10:00:52 得分 0

TextBox   tb   =   (TextBox)........FindControl("txt_1");  
  if(tb   !=   null)  
  {  
      tb.Text   =   "找到了!";  
  }Top

8 楼SuperW(精品烂人)回复于 2004-08-02 12:04:19 得分 0

谢谢各位回应,以上方法都试了。问题还没解决?Top

9 楼goody9807(http://goody9807.cnblogs.com)回复于 2004-08-02 12:11:35 得分 20

这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在  
   
  if   (!IsPostBack)  
  {  
                  //动态产生或装载控件  
                  //也许需要连接控件事件处理函数  
                //加到父控件的Controls  
  }  
   
  里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if   (!IsPostBack)之外做。我问为什么想在if   (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样  
   
  <form   id="form1"   runat=server>  
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
   
  #%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用  
   
  Button   btn   =   new   Button();  
   
  需要触发它的Click事件,你需要用  
   
  btn.Click   +=   new   EventHandler(YourHandler);  
   
  即使象包含  
   
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
   
  的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊  
   
  不信?加一个页面,TestControls.aspx:  
   
  <%@   Page   Debug="true"   %>  
  <%@   Import   Namespace="System.Data"%>  
  <%@   Import   Namespace="System.Data.SqlClient"%>  
   
  <form   id="form1"   runat=server>  
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
  <asp:DataGrid   id="DataGrid1"   runat="server"   AutoGenerateColumns="false"   GridLines="Both">  
  <Columns>  
    <asp:TemplateColumn   HeaderText="Name">  
    <ItemTemplate><%#   DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>  
    </asp:TemplateColumn>  
  </Columns>  
  </asp:DataGrid>  
  </form>  
  <script   language="C#"   runat="server">  
  void   Button_Click(Object   sender,   EventArgs   e)  
  {  
      Button   btn   =   (Button)sender;  
      Response.Write(btn.Text   +   "   is   clicked<BR>");  
  }  
   
  void   Page_Load(Object   sender,   EventArgs   e)  
  {  
         
    Button   btn   =   new   Button();  
    btn.ID   =   "Button2";  
    btn.Text   =   "Button2";  
    btn.Click   +=   new   EventHandler(Button_Click);  
    form1.Controls.Add(btn);  
        if   (!IsPostBack)  
        {  
    SqlDataAdapter   da   =   new   SqlDataAdapter("select   Name=au_fname   +   '   '   +   au_lname   from   authors",   "server=localhost;database=pubs;uid=sa;pwd=;");  
    DataTable   dt   =   new   DataTable();  
    da.Fill(dt);  
    DataGrid1.DataSource   =   dt.DefaultView;  
    DataGrid1.DataBind();  
        }  
     
  //}//这是故意的  
   
  </script>  
   
  把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx  
  Top

10 楼SuperW(精品烂人)回复于 2004-08-02 12:38:07 得分 0

goody9807():  
  现在是解决不了点击button先执行点击过程,再Page_LoadTop

11 楼SuperW(精品烂人)回复于 2004-08-02 12:40:32 得分 0

希望goody9807()  
  看看我写的代码再回答,谢谢!Top

12 楼wnlovezxm(大垃圾人)回复于 2004-08-02 13:22:16 得分 10

to:wnlovezxm(大垃圾人)  
  txt_1.text="xxx"  
  刚载页面时还没有txt_1呀,会出错的。  
   
  ------------------------------------------------------------  
   
  if   (this.Page.Controls.FindControl("txt_1")!=null)  
  {  
      (TextBox)txt_1.Text   =   "asdfasdf";  
  }  
  刚载页面时还没有txt_1,也不会出错的。有判断了,要是有“txt_1”就用,没有就不执行了你试验一下就知道了,还有不要直接粘贴我的代码,我随手写的,单词拼写可能有错,你自己在ide里写!  
  Top

13 楼wnlovezxm(大垃圾人)回复于 2004-08-02 13:22:52 得分 0

if   (this.Page.Controls.FindControl("txt_1")!=null)  
  {  
      ((TextBox)txt_1.Text)   =   "asdfasdf";  
  }  
  Top

14 楼ZeroGong(希光)回复于 2004-08-06 14:03:51 得分 20

这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在  
   
  if   (!IsPostBack)  
  {  
                  //动态产生或装载控件  
                  //也许需要连接控件事件处理函数  
                //加到父控件的Controls  
  }  
   
  里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if   (!IsPostBack)之外做。我问为什么想在if   (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样  
   
  <form   id="form1"   runat=server>  
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
   
  #%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用  
   
  Button   btn   =   new   Button();  
   
  需要触发它的Click事件,你需要用  
   
  btn.Click   +=   new   EventHandler(YourHandler);  
   
  即使象包含  
   
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
   
  的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊  
   
  不信?加一个页面,TestControls.aspx:  
   
  <%@   Page   Debug="true"   %>  
  <%@   Import   Namespace="System.Data"%>  
  <%@   Import   Namespace="System.Data.SqlClient"%>  
   
  <form   id="form1"   runat=server>  
  <asp:Button   id="Button1"   runat="server"   Text="Button1"   OnClick="Button_Click"/>  
  <asp:DataGrid   id="DataGrid1"   runat="server"   AutoGenerateColumns="false"   GridLines="Both">  
  <Columns>  
    <asp:TemplateColumn   HeaderText="Name">  
    <ItemTemplate><%#   DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>  
    </asp:TemplateColumn>  
  </Columns>  
  </asp:DataGrid>  
  </form>  
  <script   language="C#"   runat="server">  
  void   Button_Click(Object   sender,   EventArgs   e)  
  {  
      Button   btn   =   (Button)sender;  
      Response.Write(btn.Text   +   "   is   clicked<BR>");  
  }  
   
  void   Page_Load(Object   sender,   EventArgs   e)  
  {  
         
    Button   btn   =   new   Button();  
    btn.ID   =   "Button2";  
    btn.Text   =   "Button2";  
    btn.Click   +=   new   EventHandler(Button_Click);  
    form1.Controls.Add(btn);  
        if   (!IsPostBack)  
        {  
    SqlDataAdapter   da   =   new   SqlDataAdapter("select   Name=au_fname   +   '   '   +   au_lname   from   authors",   "server=localhost;database=pubs;uid=sa;pwd=;");  
    DataTable   dt   =   new   DataTable();  
    da.Fill(dt);  
    DataGrid1.DataSource   =   dt.DefaultView;  
    DataGrid1.DataBind();  
        }  
     
  //}//这是故意的  
   
  </script>  
   
  把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx  
  Top

15 楼SuperW(精品烂人)回复于 2004-08-06 14:05:00 得分 0

好了,结帐!Top

相关问题

  • 动态添加控件
  • 动态添加控件
  • Delphi中能否动态添加控件?
  • 动态添加同一控件!!
  • 怎样动态添加Label控件?
  • 关于TABLE控件动态添加行
  • 动态添加控件问题!!!
  • 是否可以动态添加控件
  • 动态添加控件-------(在线等待 )
  • 页面控件的动态添加

关键词

  • c#
  • 控件
  • 页面
  • 代码
  • 执行
  • 服务器
  • 生成
  • 动态
  • 添加
  • 触发

得分解答快速导航

  • 帖主:SuperW
  • KevinCao
  • wnlovezxm
  • loveerror
  • brightheroes
  • goody9807
  • wnlovezxm
  • ZeroGong

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo