今天在测试程序的时候,碰到了这种现象:
后台代码:
for (int i = 0; i < this.GvCourses.Rows.Count; i++) { CheckBox chb = this.GvCourses.Rows[i].FindControl("CheckB") as CheckBox; if (chb.Checked) { strDelete += "," + this.GvCourses.Rows[i].Cells[0].Text; } }
前台:
<asp:GridView ID="GvCourses" runat="server">
<Columns>
<asp:BoundField HeaderText="ID" DataField="ID" HeaderStyle-CssClass="hide" FooterStyle-CssClass="hide"
ItemStyle-CssClass="hide">
<FooterStyle CssClass="hide"></FooterStyle>
<HeaderStyle CssClass="hide"></HeaderStyle>
<ItemStyle CssClass="hide"></ItemStyle>
</asp:BoundField>
<asp:TemplateField>
<HeaderTemplate>
选择
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox runat="server" ID="CheckB" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="序号" HtmlEncode="false" />
<asp:BoundField HeaderText="课程名称" DataField="C_NAME" />
<asp:BoundField HeaderText="单元类型" DataField="T_ID" />
.
.
.
</Columns>
</GridView>
但在执行时,不管怎么弄,就是执行不到 if (chb.Checked) { strDelete += "," + this.GvCourses.Rows[i].Cells[0].Text; } 这里面的东西,换句话说就是chb的checked始终为false;而另一出的却始终能执行。
于是我采用了方法一:清理了解决方案,重新编译,不行;
另一处checkbox的名字为“CheckBox1”, 我以为是名字的问题,
于是我采用了方法二:将此处的所有名字重新命名为CheckBox1, 清理解决方案,再次编译执行,还是不行;
这时采用了以前小时候经常用的终极方法:开始抱怨。
我在想是不是微软又产生了Bug。两处的代码我都已经复制成相同的样子了,还要怎样? 到底要怎样啊?
而当我静下心来想的时候,认为我产生错误的几率比微软产生Bug的几率要大,因为这个错误太明显太致命了。 于是我在检查分析;发现我每次执行后台的时候页面都有一闪,然后才执行后台,而且不管我选择多少个,后台都不会给strDelete赋值。
于是我得出: 服务器控件在执行后台代码时都会postback一次;
终于发现,问题在这:
protected void Page_Load(object sender, EventArgs e) { this.lb_message.Text = ""; bindGrid(); InitDropDownList(); } 应该为: protected void Page_Load(object sender, EventArgs e) { this.lb_message.Text = ""; if (!IsPostBack) { bindGrid(); InitDropDownList(); } }
做了上面修改时,问题解决。
每个出现的问题,都体现了自己一些知识的不足,对操作的原理还不是很了解。以后更应该虚心求教。