2013-07-15 121 views
1

我有以下代碼...嵌套的GridView複選框不切換當主GridView的複選框被切換

<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

當你運行你的第一個CheckBoxAll_OnCheckedChanged您將通過每個複選框處於運行狀態,並改變其Checked爲真或假取決於什麼CheckBoxAll已被選中爲。

這將而不是導致每運行一個複選框回發。

相反,在循環嵌套的gridview時,只需將對象和相同的eventargs傳遞給它即可調用CheckBoxAdd_OnCheckedChanged子。

例如:

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 

這將發送對象完全相同的方式與單擊該複選框最初會有。

+0

這樣想的。謝謝 – Fandango68