ASPNET中动态控件的问题
我在一个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




