asp:CheckBox后台獲取不到前台的Checked屬性


今天在測試程序的時候,碰到了這種現象:

后台代碼:

            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();
            }
        }

  做了上面修改時,問題解決。

      每個出現的問題,都體現了自己一些知識的不足,對操作的原理還不是很了解。以后更應該虛心求教。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM