GridView动态创建TemplateField的问题


 

GridView动态创建TemplateField,TemplateField.ItemTemplate中是一些文本信息,在页面回调后TemplateField.ItemTemplate的内容消失了,我想保留这些信息,请问怎么处理?
 
回复:GridView动态创建TemplateField的问题


 
回复:GridView动态创建TemplateField的问题

上面贴的文章中有这样的话:

“页面postback以后,就取不到这些控件了。其实每次在页面上动态添加控件(或者在数据控件上动态添加列),它们的状态是不会被添加到页面的ViewState中去的,所以每次回送回来,它们就消失了,程序员只能手动把这些控件再次添加到页面上来,才会还原它们的状态。”

这里描述的机制是错的。

他们的状态都在ViewState中,并且asp.net也会尝试恢复状态。只不过,对于文章中的那种情况,“尝试恢复状态”失败,所以无法显示出来那10个动态装载的控件的样子。但是,如果把这个说成是ViewState中没有他们的状态,是不了解机制的实质的错误推论。状态数据都在,例如TextBox的Text、MaxLength属性等都保存在ViewState中,但是没有在page_load结束前重建这些状态所依附的控件(根据UniqueID来唯一决定控件,因此给动态产生的控件设置id属性最重要),所以asp.net没有地方把状态放回控件。

控件从来不会放入ViewState。如果你在页面设计时放置一个控件,那么页面每一次实例化的时候都会重新根据设计代码所编译出的可执行代码,重新创建这个控件。而如果你在页面运行时动态产生一个控件,就要保证下一次页面page_load结束之前自己的代码中重建这个控件(因为page_load之后asp.net会立刻给这个控件装载状态)。
 
回复:GridView动态创建TemplateField的问题

对极端简单的应用程序的表面现象,似乎总是可以随便揣测系统运行机制。但是不深入地了解机制,特别是用自己的理解代替真实的机制,是会在深入一点的考验面前碰壁的。
 
回复:GridView动态创建TemplateField的问题

感谢“看两只小鸭子吃食”帮忙,我的代码如下,该怎么改:
public class MyItemTemplate : ITemplate
{
public MyItemTemplate(){}
public void InstantiateIn(Control Container)
{
    LiteralControl lit = new LiteralControl();
    lit.ID = "litCheck";
    lit.DataBinding += new EventHandler(this.OnDataBinding);
    Container.Controls.Add(lit);
}
public void OnDataBinding(object sender, EventArgs e)
{
    LiteralControl lit = (LiteralControl)sender;
    GridViewRow row = (GridViewRow)lit.NamingContainer;
    StringBuilder html = new StringBuilder("<input type=\"checkbox\" name=\"checkName\"");
    html.Append(" value=\"" + row.RowIndex.ToString() + "\"");
    lit.Text = html.ToString();
}
}

public class TLGridView : GridView, INamingContainer
{
        protected override void OnLoad(EventArgs e)
        {
            TemplateField field = new TemplateField();
            field.ItemTemplate = new MyItemTemplate();
            this.Columns.Insert(0, field);
            base.OnLoad(e);
        }
}
 
回复:GridView动态创建TemplateField的问题

上面的代码是扩展Gridview,在GridView前加上选择框,不能用CheckBox,或者HtmlInputCheckBox,因为两者都回自动生成UniqueID,所以只能用字符串组成Html
 
回复:GridView动态创建TemplateField的问题

sp1234说得真好,学习了
 
回复:GridView动态创建TemplateField的问题

sp1234??/不知道是谁!
 
回复:GridView动态创建TemplateField的问题

up