今天在測試程序的時候,碰到了這種現象:
后台代碼:
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();
}
}
做了上面修改時,問題解決。
每個出現的問題,都體現了自己一些知識的不足,對操作的原理還不是很了解。以后更應該虛心求教。
