2

这似乎很简单,但我似乎无法弄清楚!我试图让 2-way 数据绑定在 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();      
    }

最终,我会调用这样的东西,但我不知道应该去哪里或者如何从 gridview 中取回值:

void UpdateRequirements(object sender, EventArgs e)
{
    _userList = ???????????? // How do I get the data?
    data_layer.UpdateUserRequirements( _userList );
} 
4

2 回答 2

2

foreach (GridViewRow di in GridView1.Rows) { HtmlInputCheckBox chkBx = (HtmlInputCheckBox)di.FindControl("chkBox1");

        if (chkBx != null && chkBx.Checked)
        {
             /// put your code here
        }
    }
于 2008-11-20T15:20:21.350 回答
1

尝试这样的事情来获得改变的价值:

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 绑定复选框,因此在您的网格中执行以下操作:

<asp:CheckBox ID="<%# Eval('Id') %>" />

然后在回发时,遍历 UserRequirements 列表中的项目,将对象/项目 Id 与网格中复选框的 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 以获取您正在寻找的复选框。

于 2008-11-20T15:27:50.947 回答