C# 在嵌套的gridview中使用复选框进行操作

C# 在嵌套的gridview中使用复选框进行操作,c#,asp.net,gridview,checkbox,nested,C#,Asp.net,Gridview,Checkbox,Nested,这是GridView的设计 <asp:GridView ID="gmainrole" runat="server" OnRowDataBound="gmainrole_RowDataBound"> <Columns> <asp:TemplateField> <ItemTemplate> <input type="checkbox" id="chkavail" ru

这是GridView的设计

<asp:GridView ID="gmainrole" runat="server" OnRowDataBound="gmainrole_RowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <input type="checkbox" id="chkavail" runat="server" checked='<%#Eval("checkstatus") %>' />
                &nbsp;
                <asp:Literal ID="litstate" runat="server" Text='<%#Eval("areaname") %>'></asp:Literal>
                <asp:Literal ID="lituserrole" runat="server" Text='<%#Eval("nid") %>' Visible="false"></asp:Literal>
                <asp:GridView ID="subrole" runat="server" AutoGenerateColumns="false" OnRowDataBound="subrole_RowDataBound">
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox ID="chk1vail" runat="server" Checked='<%#Eval("checkstatus") %>' />
                                <asp:Literal ID="litstate" runat="server" Text='<%#Eval("areaname") %>'></asp:Literal>
                                <asp:Literal ID="lituserrole" runat="server" Text='<%#Eval("nid") %>' Visible="false"></asp:Literal>
                                <asp:DataList ID="glastrole" runat="server" GridLines="None" AutoGenerateColumns="false" OnItemDataBound="glastrole_ItemDataBound">
                                    <ItemTemplate>
                                        <div>
                                            <asp:CheckBoxList runat="server" ID="chklastrole">
                                            </asp:CheckBoxList>
                                            &nbsp;
                                                                                            <asp:Literal ID="Literal1" runat="server" Text='<%#Eval("areaname") %>'></asp:Literal>
                                            <asp:Literal ID="litlast" runat="server" Text='<%#Eval("nid") %>' Visible="false"></asp:Literal>
                                            <asp:DataList ID="ecounter" runat="server" GridLines="None" AutoGenerateColumns="false">
                                                <ItemTemplate>
                                                    <asp:CheckBoxList runat="server" ID="chklastrole">
                                                    </asp:CheckBoxList>

                                                    &nbsp;
                                                                                            <asp:Literal ID="Literal11" runat="server" Text='<%#Eval("areaname") %>'></asp:Literal>
                                                    <asp:Literal ID="litlast1" runat="server" Text='<%#Eval("nid") %>' Visible="false"></asp:Literal>
                                                </ItemTemplate>
                                            </asp:DataList>
                                        </div>
                                    </ItemTemplate>
                                </asp:DataList>
                                </table>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
                </td>
                    </tr>
                </table>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>


此GridView是一个四层嵌套的GridView,其中下两层是数据列表,上两层是GridView。我希望当用户选中第二个GridView中名为
subrole
(级别2)的复选框时,DataList
glastrole
(级别3)和DataList
ecounter
(级别4)中的所有后续复选框都会选中该特定级别2复选框。我会给你的代码,我一直尝试到现在,但事实是我甚至不知道如何处理这个问题。请帮忙

试试这个可以解决你的问题:

添加OnCheckedChanged属性

隐藏代码以查找控件:

    protected void Checked_Changed(object sender, EventArgs e)
    {
        // gets a row from GridView 
        GridViewRow subrole_row = ((CheckBox)sender).Parent as GridViewRow;

        // get GridView 
        GridView subrole = subrole_row.Parent as GridView;

        // find the datalist in GridView 
        DataList glastrole = subrole.Rows[subrole_row.RowIndex].FindControl("glastrole") as DataList;

        glastrole.DataSource = glastrole_dt; // set your data to datalist
        glastrole.DataBind(); // bind datalist

        subrole.DataSource = subrole_dt; // set your data to gridview
        subrole.DataBind(); // bind gridview
    }

    protected void glastrole_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
        {
            GridViewRow subrole_row = ((DataList)sender).Parent as GridViewRow;

            CheckBox chk1vail = subrole_row.FindControl("chk1vail") as CheckBox;

            // find CheckBoxList in glastrole
            CheckBoxList chklastrole = e.Item.FindControl("chklastrole") as CheckBoxList;

            // find if checkbox is checked
            if (chk1vail.Checked)
            {
                // here you can check all the CheckBoxList items
                foreach (ListItem item in chklastrole.Items)
                {
                    item.Selected = true;
                }
            }


            // find DataList in glastrole
            DataList ecounter = e.Item.FindControl("ecounter") as DataList;

            ecounter.DataSource = ecounter_dt; // set your data to datalist
            ecounter.DataBind(); // bind datalist
        }
    }

    protected void ecounter_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
        {
            DataList glastrole = ((DataList)sender).Parent as DataList;
            DataList ecounter = glastrole.Parent as DataList;

            GridViewRow subrole_row = ecounter.Parent as GridViewRow;

            CheckBox chk1vail = subrole_row.FindControl("chk1vail") as CheckBox;

            // find CheckBoxList in glastrole
            CheckBoxList chklastrole = e.Item.FindControl("chklastrole") as CheckBoxList;

            // find if checkbox is checked
            if (chk1vail.Checked)
            {
                // here you can check all the CheckBoxList items
                foreach (ListItem item in chklastrole.Items)
                {
                    item.Selected = true;
                }
            }
        }
    }