CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

ASPNET中动态控件的问题

楼主laorer(laorer)2005-06-10 09:44:21 在 .NET技术 / ASP.NET 提问

我在一个HtmlTableCell   中动态的添加了一个HtmlTable   ,这个HtmlTable中有动态添加的一个HtmlTableRow   htr   .htr中有一个动态的HtmlTableCell     htc   ,htc中有一个动态的DropDownList   ddl,  
  且ddl.ID   =   "ddl1"  
  可以显示在页面上,但当ddl的selectedIndex变化之后,按另一控件回传服务器之后   ,用    
  this.FindControl("ddl1")方法时,却找不到这个控件,请问是什么问题,要不要设置ViewState,  
   
  谢谢 问题点数:50、回复次数:20Top

1 楼mathsword(梦在流浪)回复于 2005-06-10 09:51:41 得分 5

不需要,你的动态生成不要放到!ispostback里边就行了  
  就是说直接放在page_load中就可以了  
  目的就是回发的时候重新生成一次Top

2 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-06-10 09:59:48 得分 3

恩,同意楼上观点。。直接放page_load里就可以了Top

3 楼laorer(laorer)回复于 2005-06-10 10:13:20 得分 0

private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  //   在此处放置用户代码以初始化页面  
   
  DropDownList   dl   =   (DropDownList)this.FindControl("ddl0");  
  lbl.Text   =   dl.ID.ToString();  
                                        }  
  用户的添加是在另外一块,但一定是运行了的,因为页面上可以看得到,  
  重传之后就会出现这个问题     未将对象引用设置到对象的实例。    
   
  Top

4 楼TCat(蚊子)回复于 2005-06-10 11:37:10 得分 2

在生成的页也右键-》“查看源程序”看看有没有“ddl0”这个冬冬Top

5 楼chookrib()回复于 2005-06-10 11:44:25 得分 5

你要保证在你FindControl前有生成表格和控件的操作。  
   
  你页面上可以看见,有可能是在FindControl操作后生成的。你把生成的代码放到FindControl前就可以了Top

6 楼2sanshi(磊)回复于 2005-06-10 11:50:46 得分 5

使用this.FindControl肯定找不到DropDownList   控件的,应为DropDownList是在另外一个控件里面,要用HtmlTable.FindControl来找Top

7 楼laorer(laorer)回复于 2005-06-10 12:14:39 得分 0

是HtmlTableTable.FindControl     还是HtmlTableCell.FindControl  
  还是要一步步的用htc.FindControlTop

8 楼laorer(laorer)回复于 2005-06-10 22:17:58 得分 0

按照思归的方法,在pag_load()中生成一组droplist,但是结果得到的却不是用户选择的selectedIndex  
  请问如何解决?Top

9 楼saucer(思归)回复于 2005-06-11 01:12:00 得分 30

>>>按照思归的方法????  
   
  re-create   the   control   upon   postback,   but   only   do   the   data   binding   when   the   control   is   first   created,   to   ease   your   pain,   look   into    
   
  http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspxTop

10 楼laorer(laorer)回复于 2005-06-11 07:35:49 得分 0

谢谢,但如果后来不绑定的话,则再返回客户端时,是没有绑定的,也得不到效果,  
  用了那个控件后,感觉和原来的效果一样.Top

11 楼saucer(思归)回复于 2005-06-11 08:26:26 得分 0

show   your   code   or   make   sure   give   your   control   an   ID,   like   (for   example,   in   your   button   click   event   handler)  
   
                                      DropDownList   ddl   =   new   DropDownList();  
  ddl.ID   =   "DDL1";  
  ThatDynamicControlID.Controls.Add(ddl);  
                                       
  ddl.DataSource   =   ...;  
                                      ddl.DataBind();Top

12 楼laorer(laorer)回复于 2005-06-11 08:36:08 得分 0

private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  if(!this.IsPostBack)  
  {  
  ViewState.Add("paraCount",0);  
  ViewState.Add("txtTable",0);  
  }  
  //   在此处放置用户代码以初始化页面  
  string   xmlFile   =   Server.MapPath("./doc/schema/sample/")+   "\\ttt.xml";  
  createTable();//设置dataTable  
  mkTree(xmlFile,dtb);     //将数据放到datable中去  
  string   st   =   ViewState["txtTable"].ToString();  
  if(ViewState["txtTable"].ToString()   !="0")  
  createDdl();  
  }  
   
   
  /////////上面是page_load里的Top

13 楼laorer(laorer)回复于 2005-06-11 08:41:30 得分 0

private   void   createDdl(   )  //健一组dropDownlist  
  {  
  System.Web.UI.HtmlControls.HtmlTable     htb1   =   new   HtmlTable();  
  int   pcount   =0;  
  if(ViewState["paraCount"]   !=null)  
  pcount   =   Convert.ToInt32(ViewState["paraCount"].ToString());  
  for(int   i   =   0;i<pcount;i++)  
  {  
  HtmlTableRow   htr1   =   new   HtmlTableRow();  
  HtmlTableCell   htc1   =   new   HtmlTableCell();  
  DropDownList   dl   =   new   DropDownList();  
  dl.ID   =   "ddl"+   i.ToString();  
  dl.DataSource   =   dtb;  
  dl.DataTextField   =   dtb.Columns["tagName"].ToString();  
  dl.DataValueField   =dtb.Columns["level"].ToString();  
  dl.DataBind();  
  // htc1.Controls.Add(lbll);  
   
                                  Label   lbll   =   new   Label();  
  lbll.ID="lbl"+i.ToString();  
   
  lbll.Text   =   i.ToString();  
  lbll.Visible   =   true;  
  htc1.Controls.Add(lbll);  
   
  htc1.Controls.Add(dl);  
  htr1.Controls.Add(htc1);  
  htb1.Controls.Add(htr1);  
  // htc1.Height   =   Convert.ToString(nd1.data.Length/2.44   +   25)+"PX";   ;//nd1.data.Length/20   +"px";  
  }  
  DCP.Controls.Add(htb1);  
   
                     
  }  
   
  ///这里是createDdl();  
  //还有page_load里的那个createDdl();应该是createDdl2();  
  //下面的是createDdl2()没有数据绑定  
  private   void   createDdl2(   )  //健一组dropDownlist  
  {  
  System.Web.UI.HtmlControls.HtmlTable     htb1   =   new   HtmlTable();  
  int   pcount   =0;  
  if(ViewState["paraCount"]   !=null)  
  pcount   =   Convert.ToInt32(ViewState["paraCount"].ToString());  
  for(int   i   =   0;i<pcount;i++)  
  {  
  HtmlTableRow   htr1   =   new   HtmlTableRow();  
  HtmlTableCell   htc1   =   new   HtmlTableCell();  
  DropDownList   dl   =   new   DropDownList();  
  dl.ID   =   "ddl"+   i.ToString();  
   
  Label   lbll   =   new   Label();  
  lbll.ID="lbl"+i.ToString();  
   
  lbll.Text   =   i.ToString();  
  lbll.Visible   =   true;  
  htc1.Controls.Add(lbll);  
   
  htc1.Controls.Add(dl);  
  htr1.Controls.Add(htc1);  
  htb1.Controls.Add(htr1);  
  }  
  DCP.Controls.Add(htb1);  
  }  
   
  //下面是两个控件的事件     其中     btnInputOK_Click是先进行的  
   
  private   void   btnInputOK_Click(object   sender,   System.EventArgs   e)  
  {  
  txt2.Visible   =   true;  
  txt1.Visible   =   false;  
  int   rows   =   getRows(txt1.Text);  
  createDdl();  
  txtTable(rows);  
   
  btnInputOK.Visible   =   false;  
  btnSelect.Visible   =   true;  
                          ViewState.Add("txtTable",1);  
  }  
   
  ////   下面的事件是在btnInputOk完毕后,发送到客户端后,再进行的  
  private   void   btnSelect_Click(object   sender,   System.EventArgs   e)  
  {  
  int   paraCount   =   Convert.ToInt32(ViewState["paraCount"].ToString());  
  for(int   i   =0;i<paraCount;i++)  
  {  
  DropDownList   ddl   =(DropDownList)   DCP.FindControl("ddl"+i.ToString());  
  // ddl.SelectedIndex   =   ddl.SelectedIndex;  
  Label   lb   =   new   Label();  
  lb.ID   ="lb"+i.ToString()   ;  
  lb.Text   =lb.ID+"     ,"+ddl.SelectedIndex.ToString()   +"       ;";  
  this.Controls.Add(lb);  
   
  }  
   
  }  
  Top

14 楼saucer(思归)回复于 2005-06-11 08:51:24 得分 0

so   messy,   but   try  
   
  ...  
   
  DropDownList   dl   =   new   DropDownList();  
  dl.ID   =   "ddl"+   i.ToString();  
  htc1.Controls.Add(dl);   //add   first  
  htr1.Controls.Add(htc1);  
  htb1.Controls.Add(htr1);  
  DCP.Controls.Add(htb1);  
   
  //then  
   
  dl.DataSource   =   dtb;  
  dl.DataTextField   =   dtb.Columns["tagName"].ToString();  
  dl.DataValueField   =dtb.Columns["level"].ToString();  
  dl.DataBind();  
   
  ....Top

15 楼laorer(laorer)回复于 2005-06-11 08:52:49 得分 0

那个dtb是在mkTree()里生成的,也是一个动态的DataTable,Top

16 楼renyu732(Sysinfo)回复于 2005-06-11 08:56:54 得分 0

MarkTop

17 楼lwhoami(写程序)回复于 2005-06-11 08:59:02 得分 0

我用了createDdl()   和createDdl2()就是为了在第一次绑定,在后面的情况下不绑定,和你讲解的思路我觉得是一样的,Top

18 楼laorer(laorer)回复于 2005-06-11 09:03:53 得分 0

//如果是这样的情况下,却可以行得通  
   
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  //   在此处放置用户代码以初始化页面  
  DropDownList   dd   =   new   DropDownList();  
  ArrayList   ass   =   new     ArrayList();  
  ass.Add("1");  
  ass.Add("2");  
  ass.Add("3");  
  ass.Add("4");  
  ass.Add("5");  
  ass.Add("6");  
  ass.Add("7");  
  ass.Add("8");  
  this.Controls.Add(dd);  
  dd.DataSource   =   ass;  
  dd.DataBind();  
  dd.ID   =   "dd1";  
  DropDownList   d2   =   new   DropDownList();  
  d2.ID=   "dd2";  
  d2.DataSource   =   ass;  
  d2.DataBind();  
  HtmlForm   hf   =   (HtmlForm)this.FindControl("Form1");  
  hf.Controls.Add(dd);  
  hf.Controls.Add(d2);  
  TextBox   tx   =   new   TextBox();  
  tx.ID   =   "tx";  
  hf.Controls.Add(tx);  
   
  }  
   
  ///下面是   一个btn事件,为了显示客户端的选择情况  
   
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  HtmlForm   hf   =(HtmlForm)   this.FindControl("Form1");  
  for(int   i   =1   ;i<3;i++)  
  {  
  DropDownList   ddl   =   (DropDownList)hf.FindControl("dd"+i.ToString());  
  Label   lb   =   new   Label();  
  lb.ID   =   "lb"+   i.ToString();  
  lb.Text   =   i.ToString()   +","+ddl.SelectedIndex.ToString();  
  this.Controls.Add(lb);  
   
  }  
  TextBox   tx   =   (TextBox)hf.FindControl("tx");  
  lbl.Text   =   tx.Text   ;  
   
   
  }Top

19 楼laorer(laorer)回复于 2005-06-11 09:09:27 得分 0

我的QQ是38276223   msn是vaoin@hotmail.com   如果方便的话,可以把文件传给你,如果不方便的话,就算了,不过还是谢谢你,端午节快乐!   :)Top

20 楼laorer(laorer)回复于 2005-06-13 08:16:21 得分 0

先谢谢各位了,动态控件看样子是有些麻烦,以后再找个机会好好研究一下吧Top

相关问题

  • ASPNET中动态控件的问题
  • aspnet中如何动态添加控件,还能在返回服务器后找得到添加的控件???急!
  • Delphi中能否动态添加控件?
  • table中如何添加动态控件?
  • Asp.net 中,如何动态生成控件~
  • CFormView中动态创建控件
  • 在fastreport中动态添加控件
  • asp.net(C#)中动态增加控件
  • C#中动态生成控件
  • WinForm中如何动态生成控件?

关键词

  • 控件
  • 页面
  • 用户
  • ddl
  • findcontrol
  • 生成
  • 动态
  • dropdownlist
  • htmltablecell
  • htmltable

得分解答快速导航

  • 帖主:laorer
  • mathsword
  • hackate
  • TCat
  • chookrib
  • 2sanshi
  • saucer

相关链接

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

广告也精彩

反馈

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