不知道大家有没有遇到过这种情况: 当GridView中既有在页面绑定的列又有动态在代码页绑定的列,一但发生PostBack 就会出现列重复的现象。如下:
a.aspx页面中的代码:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ondatabound="GridView1_DataBound" onrowdatabound="GridView1_RowDataBound"> <Columns > <asp:TemplateField > <HeaderTemplate>显示</HeaderTemplate> <ItemTemplate > <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack ="true" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField > <HeaderTemplate>锁定</HeaderTemplate> <ItemTemplate > <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack ="true" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
a.aspx.cs中的代码:
public partial class test_test16_call_procedure : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { boundColumToGrid(); } private int boundColumToGrid() { Titles_names tn = new Titles_names("FMTCS10001", 1); GridView1.DataSource = tn.Dds; BoundField bc1 = new BoundField(); BoundField bc2 = new BoundField(); BoundField bc3 = new BoundField(); BoundField bc4 = new BoundField(); bc1.HeaderText = "显示名称"; bc1.DataField = "clm_cap"; GridView1.Columns.Add(bc1); bc2.HeaderText = "宽度"; bc2.DataField = "clm_width"; GridView1.Columns.Add(bc2); GridView1.DataBind(); return 1; } }
页面中绑定的是两列CheckBox,后台则是两列数据。运行后的效果:
一切正常。但是当你点击一个复选框后:
看见了吧,其它列出现了重复,而CheckBox列却没有。
原因就在于写在页面上的两列CheckBox 在每次页面unload时去掉,在加载时自动加入;而写在后台代码中的列则会一直存在。
估计你会想:在每次页面load时清空不就行了么。所以我们在代码中加入一段代码:
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { GridView1.Columns.Clear(); } boundColumToGrid(); }
效果估计你也猜出来了:
是不重复了,但PostBack后那两列没了。那两列是在Page_Load之前绑定上去的,所以一Clear()就没了。
我没想到好的解决办法,只能用最笨的办法来解决了:
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { removeColum(); } boundColumToGrid(); } private void removeColum() { GridView1.Columns.RemoveAt(2); GridView1.Columns.RemoveAt(2); }
每次Page_load的时候把我们之前在后台绑的列给去掉。(就这样问题还不算完!)
所以看来数据的绑定要么全放在页面要么全放在后台代码,要不然问题多多。
不知道各位是怎么处理的,静等高见。