检验你的动态控件在PostBack后是否还在的一个方法是,加一个按钮看PostBack后的行为
下面是一个简单的测试
<html><body><form runat="server"><asp:DataGrid id="DataGrid1" runat="server" GridLines="Both" AutoGenerateColumns="false"OnItemCommand="DataGrid1_ItemCommand"> <Columns> <asp:ButtonColumn HeaderText="Static Button" Text="Click Me" CommandName="Static"/> <asp:TemplateColumn HeaderText="Data"> <ItemTemplate><%#Container.DataItem%></ItemTemplate> </asp:TemplateColumn> </Columns></asp:DataGrid><asp:Button id="btnAddAColumn" runat="server" Text="Add a column" OnClick="AddButtonColumn"/><asp:Button id="btnRefresh" runat="server" Text="Refresh" /></form></body></html><script language="C#" runat="server">void BindGrid(){ DataGrid1.DataSource = new string[] {"a","b","c"}; DataGrid1.DataBind();}
void Page_Load(object sender, EventArgs e){ if (!IsPostBack) { BindGrid(); }}
void DataGrid1_ItemCommand(Object sender, DataGridCommandEventArgs e){ Response.Write("ItemCommand is called<BR>"); LinkButton btn = e.CommandSource as LinkButton; if (btn != null) Response.Write(String.Format("{0} is clicked on row {1}", btn.CommandName, e.Item.ItemIndex)); }
//lifted from the original postpublic void CreateGridColumn(DataGrid OperationDataGrid){ ButtonColumn NewButCol = new ButtonColumn() ; NewButCol.Text = "编辑" ; NewButCol.HeaderText = "操作" ; NewButCol.CommandName = "Edit" ; NewButCol.ButtonType = ButtonColumnType.LinkButton; NewButCol.Visible = true ; OperationDataGrid.Columns.Add(NewButCol) ; //OperationDataGrid.Columns.AddAt(1,NewButCol) ;}
bool ButtonAdded{ get { object o = ViewState["ButtonAdded"]; if (o == null) return false; else return (bool)o; } set { ViewState["ButtonAdded"] = value;}}
void AddButtonColumn(object sender, EventArgs e){ CreateGridColumn(DataGrid1); ButtonAdded = true; BindGrid(); btnAddAColumn.Visible = false;}
protected override void LoadViewState(object savedState){ base.LoadViewState(savedState); //在这里重新添加,假如已经添加的话 if (ButtonAdded) CreateGridColumn(DataGrid1); }</script>