从GridViewRow获取控件的问题

时间:2014-04-04 14:14:11

标签: c# asp.net gridview checkbox webforms

我有一个按钮点击创建的gridview。它有一些复选框,因此用户可以调整某些页面的CRUD访问权限,然后保存所有行。

我有另一个按钮来保存我循环的行,获取rowID和访问权限以进行保存。

我在保存时遇到问题,它无法在行中找到控件,当它到达ID =我得到一个对象引用异常。如果我先做复选框分配,我会在C =部分得到错误。

protected void btnSave_Click(object sender, EventArgs e)
{
    foreach (GridViewRow r in gvRights.Rows)
    {
        if (r.RowType == DataControlRowType.DataRow)
        {    
            int ID;
            ID = Convert.ToUInt16(r.Cells[0].ToString());

            bool C, R, U, D;

            CheckBox chkC = r.FindControl("chkC") as CheckBox;
            C = chkC.Checked;
            CheckBox chkR = r.FindControl("chkR") as CheckBox;
            R = chkR.Checked;
            CheckBox chkU = r.FindControl("chkU") as CheckBox;
            U = chkU.Checked;
            CheckBox chkD = r.FindControl("chkD") as CheckBox;
            D = chkD.Checked;
        }


    }
}

的GridView:

 <asp:GridView ID="gvRights" runat="server" Width="100%" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical" AutoGenerateColumns="False" OnRowDataBound="gvRights_RowDataBound">
        <AlternatingRowStyle BackColor="#DCDCDC" />
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="Page ID" />
            <asp:BoundField DataField="PageName" HeaderText="Page Name" />
            <asp:BoundField DataField="PageDesc" HeaderText="Page Desc" />
            <asp:TemplateField HeaderText="Create"></asp:TemplateField>
            <asp:TemplateField HeaderText="Read"></asp:TemplateField>
            <asp:TemplateField HeaderText="Update"></asp:TemplateField>
            <asp:TemplateField HeaderText="Delete"></asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
        <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
        <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
        <SortedAscendingCellStyle BackColor="#F1F1F1" />
        <SortedAscendingHeaderStyle BackColor="#0000A9" />
        <SortedDescendingCellStyle BackColor="#CAC9C9" />
        <SortedDescendingHeaderStyle BackColor="#000065" />
    </asp:GridView>

1 个答案:

答案 0 :(得分:1)

如果要以编程方式添加复选框,则需要在pageinit(page_load之前)的每个页面加载中重新添加它们。这样,每个回发都会添加控件,并从视图状态中填充它们的值。

更简单的方法是在定义

中的模板字段中实际添加复选框
       <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkC" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:CheckBox runat="server" ID="chkC" />
            </EditItemTemplate>
        </asp:TemplateField>