从asp.net gridview模板列内的复选框获取数据

从asp.net gridview模板列内的复选框获取数据,asp.net,data-binding,gridview,Asp.net,Data Binding,Gridview,这似乎很简单,但我似乎想不出来!我正在尝试使双向数据绑定在ASP.net页面上工作,并将复选框作为列之一。如何从gridview获取更新的值(从复选框中) 以下是我的数据类型: [Serializable] public class UserRequirements { public string FirstName { get; set; } public string LastName { get; set; } public string UserId { get

这似乎很简单,但我似乎想不出来!我正在尝试使双向数据绑定在ASP.net页面上工作,并将复选框作为列之一。如何从gridview获取更新的值(从复选框中)

以下是我的数据类型:

[Serializable]
public class UserRequirements 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserId { get; set; }
    public string Email { get; set; }

    public bool ThingRequired { get; set; }
}
我的标记如下所示:

<form id="form1" method="post" runat="server" >
    <asp:GridView ID="UserTable" runat="server" AutoGenerateColumns="false" >
    <Columns>
        ...
        <asp:TemplateField HeaderText="Required ?">
            <ItemTemplate>
                <asp:CheckBox id="chkBox1" runat="server"  on
                Text ="Required"
                checked='<%# DataBinder.Eval(Container.DataItem,"ThingRequired")  %>'>
                </asp:CheckBox>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    </asp:GridView>
    <asp:Button id="thebutton" Text="Save Changes" OnClick="UpdateRequirements" runat="server"  CausesValidation=false  />  
</form>
    List<UserRequirements > _userList = new List<UserRequirements >();

    protected void Page_Load(object sender, EventArgs e)
    {
        _userList = data_layer.GetUserRequirments();


        this.UserTable.DataSource = _userList;
        this.UserTable.DataBind();      
    }
<asp:CheckBox ID="<%# Eval('Id') %>" />
        foreach (UserRequirement item in Requirements)
        {
            Control c = grid.FindControl(item.Id);
            CheckBox cbx = c as CheckBox;
            if (cbx != null)
            {
                bool value = cbx.Checked;
                //update db
            }
        }
foreach(GridView1.Rows中的GridViewRow di) { HtmlInputCheckBox chkBx=(HtmlInputCheckBox)di.FindControl(“chkBox1”)


尝试以下操作以获取更改时的值:

protected void OnCheckedChanged(object sender, EventArgs e)
{    
   CheckBox c = (CheckBox)sender as CheckBox;    
   string checkBoxId = c.ID;    
   bool checkBoxValue = c.Checked;
   //update database
}
[编辑]

如果希望一次性从网格中的行中获取所有值,则需要使用UserRequirements列表中的行或项的Id绑定复选框,因此在网格中执行以下操作:

<form id="form1" method="post" runat="server" >
    <asp:GridView ID="UserTable" runat="server" AutoGenerateColumns="false" >
    <Columns>
        ...
        <asp:TemplateField HeaderText="Required ?">
            <ItemTemplate>
                <asp:CheckBox id="chkBox1" runat="server"  on
                Text ="Required"
                checked='<%# DataBinder.Eval(Container.DataItem,"ThingRequired")  %>'>
                </asp:CheckBox>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    </asp:GridView>
    <asp:Button id="thebutton" Text="Save Changes" OnClick="UpdateRequirements" runat="server"  CausesValidation=false  />  
</form>
    List<UserRequirements > _userList = new List<UserRequirements >();

    protected void Page_Load(object sender, EventArgs e)
    {
        _userList = data_layer.GetUserRequirments();


        this.UserTable.DataSource = _userList;
        this.UserTable.DataBind();      
    }
<asp:CheckBox ID="<%# Eval('Id') %>" />
        foreach (UserRequirement item in Requirements)
        {
            Control c = grid.FindControl(item.Id);
            CheckBox cbx = c as CheckBox;
            if (cbx != null)
            {
                bool value = cbx.Checked;
                //update db
            }
        }

注意:您可能需要递归使用FindControl来搜索子控件,或者对网格中的每个GridViewRow对象执行foreach以选中您要查找的复选框。

我认为这种方法效果最好。如果希望在选中复选框后立即更新值,请记住将复选框的AutoPostBack属性设置为“True”。