日期:2014-05-20  浏览次数:20416 次

关于dataGrid获取动态模板列内控件的问题
我在后台动态给datagrid加了几个模板列,包括一列linkbutton,当我在点击linkbutton后页面刷新了,结果所有动态添加的模板列都没有了,在后台也不能获取模板列中textbox的值。
代码如下:
public   class   MyTextBox   :   ITemplate//模板列类 {
private   string   _ID   =   " ";
private   bool   _enable   =   false;  
public   MyTextBox(string   id,bool   enable)
{
this._ID   =   id;
this._enable   =   enable;
}
public   void   InstantiateIn(Control   container)              
{
System.Web.UI.WebControls.TextBox   textBox=new     System.Web.UI.WebControls.TextBox();
textBox.ID=this._ID;
textBox.Enabled   =   this._enable;
container.Controls.Add(textBox);
}
}//end   of   class

//动态添加模板列
TemplateColumn   templateColumn   =   new   TemplateColumn();
templateColumn.HeaderText   =   tempSubject.Name+ "成绩 ";
MyTextBox   score   =   new     MyTextBox(tempSubject.Name,false);
//
templateColumn.ItemTemplate   =   score;
this.datagridStudentInfo.Columns.Add(templateColumn);
请问如何才能保存到模板列的状态?

------解决方案--------------------
没有看你的东西,说说基本的逻辑:

在page_load结束之前,你必须重建datagrid,只有一模一样的控件——特别是内嵌子控件都与上次输出页面时完全一样(确切地说每一个内嵌控件的UniqueID都不变),asp.net才能找到位置给你把客户端提交的值填入、状态恢复、事件准备好,否则找不到相应的子控件,asp.net就忽略了提交的内容了。

因此如果你首先重建了datagrid,才能在随后的事件中获得内部控件的值。当然如果某行是编辑状态,那么重建的时候这一行仍然要建立为编辑行,才能取得编辑行内嵌的子控件的值。

如果你使用asp.net2.0,那么必须在page_load结束之前就重建好。有些asp.net1.1的程序,在page_load之后的某个事件中,在获取数据之前才重建datagrid(且不说当在多个事件中反复重建多么不应该),这在aspnet2.0中行不通了。如果你抄袭这样的程序用道asp.net2.0种,会发现根本运行结果是错误的,会很郁闷。所以如果你使用asp.net2.0或者将来会使用,现在就开始对asp.net1.1的程序保持一定的警觉。