C#asp.net复选框未选中时不触发

C#asp.net复选框未选中时不触发,c#,asp.net,checkbox,C#,Asp.net,Checkbox,我在一些地方发现了这个问题,但没有解决方案 我在gridview中有一个复选框: <asp:TemplateField HeaderText="Closed?"> <ItemTemplate > <asp:CheckBox ID="Status_CB" runat="server" AutoPostBack="true" OnCheckedChanged="Status_CB_CheckedChanged"

我在一些地方发现了这个问题,但没有解决方案

我在gridview中有一个复选框:

<asp:TemplateField HeaderText="Closed?">
    <ItemTemplate >
        <asp:CheckBox ID="Status_CB"  runat="server" AutoPostBack="true" 
            OnCheckedChanged="Status_CB_CheckedChanged" 
            EnableViewState="true" ViewStateMode="Enabled" 
            Checked='<%# Convert.ToString(Eval("cStatus")) == "1" ? true : false %>'/>
    </ItemTemplate>
</asp:TemplateField>
当我最初选中该复选框时,它可以工作。当我取消选中它时,状态_CB_CheckedChanged的第一行上的断点根本不会触发

我错过了什么?谁知道

更新-这是表,它是嵌套的。我想知道这是否是它不会在取消选中时调用回发的原因

更新-好的,我放弃了,这一定是asp中嵌套gridview的错误,所以如果您有嵌套gridview,我建议不要使用复选框。我将我的切换到cStatus“open”或“closed”的文本字段,并使用带有命令参数的按钮,该命令参数是行索引:

<asp:GridView ID="JobInfo_GV" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid2" OnRowCommand="JobInfo_GV_RowCommand">
<asp:BoundField DataField="cStatus" HeaderText="Status" ReadOnly="True" HeaderStyle-CssClass="center-row" ItemStyle-CssClass="center-row"/>  
<asp:TemplateField HeaderText="Update">
    <ItemTemplate >
      <asp:Button id="UpdateClosed" commandname="Select" buttontype="button" Text="ToggleStatus"  runat="server" CommandArgument='<%# Container.DataItemIndex %>'/>
    </ItemTemplate>
</asp:TemplateField>

我刚刚创建了一个项目,并重用了您的代码作为它的一部分。 它的工作原理与您期望的一样:

注意您需要为
复选框
控件设置
AutoPostBack=“true”

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GV" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="Name">
                    </asp:BoundField>
                    <asp:TemplateField HeaderText="Closed?">
                        <ItemTemplate>
                            <asp:CheckBox ID="Status_CB" runat="server" AutoPostBack="true"
                                OnCheckedChanged="Status_CB_CheckedChanged"
                                EnableViewState="true" ViewStateMode="Enabled"
                                Checked='<%# Convert.ToString(Eval("cStatus")) == "1" ? true : false %>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

以及背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                BindGrid();
        }

        public class DataS
        {
            public int cStatus { get; set; }
            public string Name { get; set; }
        }
        private void BindGrid()
        {
            List<DataS> list = new List<DataS>() { new DataS() { Name = "Name1", cStatus = 1 }, new DataS() { Name = "Name2", cStatus = 1 }, new DataS() { Name = "Name3", cStatus = 0 } };
            GV.DataSource = list;
            GV.DataBind();
        }

        protected void Status_CB_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            GridViewRow row = (GridViewRow)cb.Parent.Parent;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
命名空间WebApplication1
{
公共部分类默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
BindGrid();
}
公共类数据
{
公共int cStatus{get;set;}
公共字符串名称{get;set;}
}
私有void BindGrid()
{
List List=new List(){new DataS(){Name=“Name1”,cStatus=1},new DataS(){Name=“Name2”,cStatus=1},new DataS(){Name=“Name3”,cStatus=0};
GV.DataSource=列表;
GV.DataBind();
}
受保护的无效状态\u CB\u CheckedChanged(对象发送方,事件参数e)
{
复选框cb=(复选框)发送方;
GridViewRow=(GridViewRow)cb.Parent.Parent;
}
}
}

我测试了你的代码。它工作得很好!你能发布完整的aspx和c代码吗?我想知道是不是因为gridview是gridview中的templateview…请检查我的答案并与你的代码进行比较。我的答案如您所料。已更新以添加我的完整表格。您的解决方案有效,直到我将其包装到表中,然后失败。您需要为复选框控件设置AutoPostBack=“true”。您的原始代码中有,但您的新代码中没有!这不是问题吗?自动回发设置为true。当我开始将解决方案更改为使用文本框和按钮,而不是有缺陷的复选框时,我删除了它。如果有人在嵌套的gridview中使用复选框,那么原始答案中现在有一个解决方法
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GV" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="Name">
                    </asp:BoundField>
                    <asp:TemplateField HeaderText="Closed?">
                        <ItemTemplate>
                            <asp:CheckBox ID="Status_CB" runat="server" AutoPostBack="true"
                                OnCheckedChanged="Status_CB_CheckedChanged"
                                EnableViewState="true" ViewStateMode="Enabled"
                                Checked='<%# Convert.ToString(Eval("cStatus")) == "1" ? true : false %>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                BindGrid();
        }

        public class DataS
        {
            public int cStatus { get; set; }
            public string Name { get; set; }
        }
        private void BindGrid()
        {
            List<DataS> list = new List<DataS>() { new DataS() { Name = "Name1", cStatus = 1 }, new DataS() { Name = "Name2", cStatus = 1 }, new DataS() { Name = "Name3", cStatus = 0 } };
            GV.DataSource = list;
            GV.DataBind();
        }

        protected void Status_CB_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            GridViewRow row = (GridViewRow)cb.Parent.Parent;
        }
    }
}