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

  做了上面修改时,问题解决。

      每个出现的问题,都体现了自己一些知识的不足,对操作的原理还不是很了解。以后更应该虚心求教。

原文地址:https://www.cnblogs.com/crazylight/p/2519914.html