【问题标题】:Setting the checkbox checked value(the initial) as true in the grid view make a strange behavior在网格视图中将复选框选中值(初始值)设置为 true 会产生奇怪的行为
【发布时间】:2014-12-23 21:41:55
【问题描述】:

当我将 gridview 中的复选框默认设置为 Checked = true 时,我遇到了一个奇怪的行为!

    <asp:UpdatePanel ID="UpdatePanel3" runat="server">
        <ContentTemplate>
            <asp:Panel ID="pnl_lect" runat="server">
     <asp:GridView ID="gv_lect" runat="server" AutoGenerateColumns="False" DataKeyNames="prog_ser,lect_code,lect_type"
                        CssClass="formTable cr_center" OnDataBound="gv_lect_DataBound" OnRowDataBound="gv_lect_RowDataBound">
                        <Columns>
                            <asp:BoundField HeaderText="lect_name" DataField="name" />
                            <asp:TemplateField HeaderText="1">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_1" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="2">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_2" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="3">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_3" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="4">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_4" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="5">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_5" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="6">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_6" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="7">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_7" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="8">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_8" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="9">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_9" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="10">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_10" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="11">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_11" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="12">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_12" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="13">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_13" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="14">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_14" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="15">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_15" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="16">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_16" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="17">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_17" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="18">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_18" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="19">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_19" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="20">
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox_20" runat="server" Checked="false" AutoPostBack="true"
                                        OnCheckedChanged="CheckBox1_CheckedChanged" />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView> 
  </asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>

 protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            bool res = true;
            try
            {

                CheckBox chkbox = (CheckBox)sender;

                GridViewRow r = (GridViewRow)chkbox.NamingContainer;
                ProgAbsence abs = new ProgAbsence();

                int progSer = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[0].ToString());
                int lectCode = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[1].ToString());
                int lectType = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[2].ToString());
                int sessionId = int.Parse(chkbox.ID.Split('_')[1]);
                abs.LectCode = lectCode;
                abs.LectType = lectType;
                abs.ProgSer = progSer;
                abs.SessionId = sessionId;
                if (chkbox.Checked)
                {
                    res = abs.Add();
                }
                else
                {
                    res = abs.Delete();
                }
                BindAbsence();
            }
            catch (Exception ee)
            {
                res = false;
                BindAbsence();
            }
        }
        /* =========================================================================== */
        protected void gv_lect_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.DataItemIndex >= 0)
            {


                DataTable dt = ((DataTable)ViewState["abs"]);
                if (dt != null && dt.Rows.Count > 0)
                {

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[0].ToString().Trim() == dt.Rows[i]["prog_ser"].ToString()
                            &&
                            ((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[1].ToString().Trim() == dt.Rows[i]["lect_code"].ToString()
                            &&
                            ((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[2].ToString().Trim() == dt.Rows[i]["lect_type"].ToString())
                        {
                            ((CheckBox)(e.Row.Cells[int.Parse(dt.Rows[i]["session_id"].ToString())].Controls[1])).Checked = true;
                        }

                    }
                }
            }
        }
        /* =========================================================================== */

此代码工作正常,但是当我将所有复选框选中属性默认值为 true 而不是 false 时,我得到错误的复选框(不是发件人)并且事件有时并非一直有效! 如何使复选框默认值为 true 并使其按预期工作?

【问题讨论】:

  • 为什么会出现错误?您是否至少在catch 中设置了断点?你有例外吗?
  • @TimSchmelter:我已经试过了。 CheckBox chkbox = (CheckBox)sender; 复选框 id 不是我点击的那个,有时我觉得它卡住了,支票没有改变!
  • 你是在c#中还是在aspx页面中设置了默认值=true?
  • @Koen :在 aspx 页面中
  • 并且只有 1 个(错误的)复选框发送回发吗?还是当您单击 1 时它们全部?

标签: c# asp.net ajax gridview checkbox


【解决方案1】:

您是否在 Page 指令或包含 GridView 的控件中将 EnableViewState 设置为 false

<%@ Page EnableViewState="false" ... %>

如果不将此设置为trueCheckBox.CheckedChanged Event 可能无法正常工作。 MSDN 说:

CheckBox 控件必须在发送到服务器的帖子之间保留一些值,才能使此事件正常工作。确保为此控件启用了视图状态。

【讨论】:

    【解决方案2】:

    请在新解决方案中测试上述场景,而不是从数据库绑定 gridview,尝试使用定义的数据(带值的 DataTable)绑定它。然后从那里逐步实现您的代码。

    【讨论】:

    • 得到了一个负面反馈:(...我没有足够的声誉来发表评论。我试图帮助他...我想我的建议也是link的一部分
    • @just_name,请在新解决方案中重新构建您的项目或特定场景。我实际上在我当地尝试过你的场景,并没有遇到你所说的。可能您的数据绑定代码之一或某事会导致问题。
    【解决方案3】:

    这是清单,您应该在此清单上查看..

    1. 确保您在页面上启用了ViewState

    2. 您正在使用更新面板,因此将 Children As Trigger 属性设置为 true

    3. 确保AutoPostBack=true

    4. 如果您将 Gridview 绑定到 Page_load 将绑定放入 if(!IsnotPostBack) {}

    5. 确保您没有使用javascript检查或更改复选框 如果您仍然有问题,请创建新页面并尝试仅使用 grid-view 这可能是其他问题..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多