切换主gridview复选框时,嵌套的gridview复选框不会切换

时间:2013-07-15 03:51:13

标签: asp.net gridview checkbox nested

我有以下代码......

<asp:GridView ID="gvStudents" runat="server" DataSourceID="SqlDataSourceStudents" AutoGenerateColumns="False" Width="100%" OnRowDataBound="gvStudents_RowDataBound">
    <HeaderStyle BackColor="#5D7B9D" ForeColor="White" />
    <AlternatingRowStyle BackColor="#EEEEEE" />
    <RowStyle BackColor="White" />
    <Columns>
        <asp:TemplateField HeaderText="Student" ControlStyle-Width="120px" >
            <ItemTemplate>
                <asp:Label ID="lblName" runat="server" Text='<%# Eval("StudentName") %>' ToolTip='<%# Eval("ProgramName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Mobile" ControlStyle-Width="70px" ItemStyle-HorizontalAlign="Center" >
            <ItemTemplate>
                <asp:Label ID="lblMobile" runat="server" Text='<%# Eval("StudentMobilePhone") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Next Of Kin" HeaderStyle-HorizontalAlign ="Center" ItemStyle-HorizontalAlign ="Left" >
            <ItemTemplate>
                <asp:GridView ID="gvNOKs" runat="server" AutoGenerateColumns="False" BorderStyle="None" GridLines="Vertical" ShowHeader="false" ShowFooter="false" >
                    <Columns>
                        <asp:TemplateField HeaderText="Given Name" ControlStyle-Width="150px" >
                            <ItemTemplate>
                                <asp:Label ID="lblNOKGivenName" runat="server" Text='<%# Bind("NOKname") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="NoK Type" ItemStyle-HorizontalAlign="Center" ControlStyle-Width="100px" >
                            <ItemTemplate>
                                <asp:Label ID="lblNOKType" runat="server" Text='<%# Bind("NOKType") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Mobile" ControlStyle-Width="100px" ItemStyle-HorizontalAlign="Center" >
                            <ItemTemplate>
                                <asp:Label ID="lblNOKMobile" runat="server" Text='<%# Bind("NOKMobile") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox ID="cbNOKAdd" runat="server" />
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Center" />
                        </asp:TemplateField>
                   </Columns>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:CheckBox id="CheckBoxAll" runat="server" OnCheckedChanged="CheckBoxAll_OnCheckedChanged" AutoPostBack="true" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox ID="CheckBoxAdd" runat="server" OnCheckedChanged="CheckBoxAdd_OnCheckedChanged" AutoPostBack="true" />
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
    </Columns>
</asp:GridView>

问题是,当我切换“CheckBoxAll”复选框时,我有一个C#代码(CheckBoxAll_OnCheckedChanged)必须遍历所有“CheckBoxAdd”复选框并切换它们以匹配主复选框。这很好。

但是没有发生的是嵌套的gridview“cbNOKAdd”复选框也没有被切换。我希望它们也会改变,因为CheckBoxAdd_OnCheckedChanged()过程中的代码会为你做这件事。

换句话说,单独运行CheckBoxAll_OnCheckedChanged()并切换“CheckBoxAdd”复选框,不会切换嵌套的gridview复选框。

ASP.net是否强制程序员对每个控件的每个事件进行编码,即使某些控件是由父代码管理的?

谢谢

1 个答案:

答案 0 :(得分:1)

当您运行第一个CheckBoxAll_OnCheckedChanged时,您将浏览每个复选框并将其Checked更改为True或False,具体取决于CheckBoxAll被勾选的内容。

这将导致每个正在运行的复选框上的回发。

相反,在循环嵌套gridview时,您可以通过将对象和相同的eventargs传递给它来调用CheckBoxAdd_OnCheckedChanged sub。

例如:

Sub CheckBoxAll_OnCheckedChanged(sender as object, e as eventargs)
    'Loop through gridview here
    'When finding the control CheckBoxAdd just call
     For each gvRow as GridviewRow in gvStudents.Rows
         dim CheckBoxAdd as Checkbox = gvRow.FindControl("CheckBoxAdd")
         CheckBoxAdd.Checked = True 'Or false dependent on CheckBoxAll
         CheckBoxAll_OnCheckedChanged(CheckBoxAdd, e)
     Next
End Sub

这将以与单击原始复选框完全相同的方式发送对象。