给静态DataGrid动态添加列的问题

这个问题反复在论坛出现,其实这个问题在MSDN上早就有答案
1。英文版: Top Questions about the DataGrid Web Server Control(Mike Pope and Nikhil Kothari)
2。中文版: DataGrid Web 伺服器控制项的常见问题

可惜,论坛上的风气不太好,你即使给了连接,真正去看的人大概并不多

诀窍是,如果动态添加了列的话,需要在下一次PostBack时,在LoadViewState或更早把这些列重新添加。原因是,在Page类递归调用LoadViewState时,会调用DataGrid的CreateChildControls,而DataGrid的(实际上是它的父类的实现)CreateChildControls会调用DataGrid的CreateControlHierarchy()方法。在其中,DataGrid会根据当前的列的数目构造DataGridItem里的东西,然后从ViewState里恢复原来的数据。如果你没有重新添加你的动态列的话,你的动态列在PostBack后就会消失,更不用谈触发列里的控件的事件了

检验你的动态控件在PostBack后是否还在的一个方法是,加一个按钮看PostBack后的行为

下面是一个简单的测试

 

 1 None.gif < html >
 2 None.gif < body >
 3 None.gif < form  runat ="server" >
 4 None.gif < asp:DataGrid  id ="DataGrid1"  runat ="server"  
 5 None.gifGridLines ="Both"  AutoGenerateColumns ="false"
 6 None.gifOnItemCommand ="DataGrid1_ItemCommand" >
 7 None.gif  < Columns >
 8 None.gif  < asp:ButtonColumn  HeaderText ="Static Button"  Text ="Click Me"  
 9 None.gif CommandName ="Static" />
10 None.gif  < asp:TemplateColumn  HeaderText ="Data" >
11 ExpandedBlockStart.gifContractedBlock.gif   < ItemTemplate > <% dot.gif #Container.DataItem %> </ ItemTemplate >
12 None.gif  </ asp:TemplateColumn >
13 None.gif  </ Columns >
14 None.gif </ asp:DataGrid >
15 None.gif < asp:Button  id ="btnAddAColumn"  runat ="server"  Text ="Add a column"  OnClick ="AddButtonColumn" />
16 None.gif < asp:Button  id ="btnRefresh"  runat ="server"  Text ="Refresh"   />
17 None.gif </ form >
18 None.gif </ body >
19 None.gif </ html >
20 ExpandedBlockStart.gifContractedBlock.gif < script  language ="C#"  runat ="server" > dot.gif
21InBlock.gifvoid BindGrid()
22ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
23ExpandedSubBlockStart.gifContractedSubBlock.gif DataGrid1.DataSource = new string[] dot.gif{"a","b","c"};
24InBlock.gif DataGrid1.DataBind();
25ExpandedSubBlockEnd.gif}

26InBlock.gif
27InBlock.gifvoid Page_Load(object sender, EventArgs e)
28ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
29InBlock.gif  if (!IsPostBack)
30ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
31InBlock.gif BindGrid();
32ExpandedSubBlockEnd.gif  }

33ExpandedSubBlockEnd.gif}

34InBlock.gif
35InBlock.gifvoid DataGrid1_ItemCommand(Object sender, DataGridCommandEventArgs e)
36ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
37InBlock.gif Response.Write("ItemCommand is called<BR>");
38InBlock.gif LinkButton btn = e.CommandSource as LinkButton;
39InBlock.gif if (btn != null)
40InBlock.gif  Response.Write(String.Format("{0} is clicked on row {1}", btn.CommandName, e.Item.ItemIndex));
41InBlock.gif         
42ExpandedSubBlockEnd.gif}

43InBlock.gif
44InBlock.gif//lifted from the original post
45InBlock.gifpublic void CreateGridColumn(DataGrid OperationDataGrid)
46ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
47InBlock.gif   ButtonColumn NewButCol = new ButtonColumn() ;
48InBlock.gif   NewButCol.Text = "编辑" ;
49InBlock.gif   NewButCol.HeaderText = "操作" ;
50InBlock.gif   NewButCol.CommandName = "Edit" ;
51InBlock.gif   NewButCol.ButtonType = ButtonColumnType.LinkButton;
52InBlock.gif   NewButCol.Visible = true ;
53InBlock.gif   OperationDataGrid.Columns.Add(NewButCol) ;
54InBlock.gif   //OperationDataGrid.Columns.AddAt(1,NewButCol) ;
55ExpandedSubBlockEnd.gif}

56InBlock.gif
57InBlock.gifbool ButtonAdded
58ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
59ExpandedSubBlockStart.gifContractedSubBlock.gif get dot.gif
60InBlock.gif  object o = ViewState["ButtonAdded"]; 
61InBlock.gif  if (o == null
62InBlock.gif   return false
63InBlock.gif  else return (bool)o;
64ExpandedSubBlockEnd.gif     }

65ExpandedSubBlockStart.gifContractedSubBlock.gif set dot.gif{ ViewState["ButtonAdded"= value;}
66ExpandedSubBlockEnd.gif}

67InBlock.gif
68InBlock.gifvoid AddButtonColumn(object sender, EventArgs e)
69ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
70InBlock.gif CreateGridColumn(DataGrid1);
71InBlock.gif ButtonAdded = true;
72InBlock.gif BindGrid();
73InBlock.gif btnAddAColumn.Visible = false;
74ExpandedSubBlockEnd.gif}

75InBlock.gif
76InBlock.gifprotected override void LoadViewState(object savedState)
77ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
78InBlock.gif base.LoadViewState(savedState);
79InBlock.gif 
80InBlock.gif//在这里重新添加,假如已经添加的话
81InBlock.gif if (ButtonAdded)
82InBlock.gif CreateGridColumn(DataGrid1); 
83ExpandedBlockEnd.gif}

84None.gif
</ script >
85 None.gif

转载于:https://www.cnblogs.com/Aresd/archive/2005/08/15/215338.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值