簡體   English   中英

兒童圍欄復選框無法正確更新

[英]child gird checkbox would not update correctly

我在兩個網格中都有一個帶有復選框的嵌套網格。 父網格中的復選框具有一個OnCheckedChanged事件,用於檢查父網格中的所有復選框,另一個事件用於檢查子網格中的所有復選框,並在每行中都具有復選框。

ASPX

<asp:GridView ID="gvSelect" runat="server" AutoGenerateColumns="false" OnRowDataBound="gvSelect_DataBound"
              BackColor="White" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" CellPadding="4" DataKeyNames="ItemNumber">
    <Columns>
        <asp:BoundField Visible="False" DataField="RecordUID" SortExpression="RecordUID" HeaderText="RecordUID" ReadOnly="True" />
        <asp:TemplateField>
            <ItemTemplate>
                <img alt = "" style="cursor: pointer" src="Images/plus.png" id="ExpandRows" class="expand" />
                <asp:Panel ID="pnlSelectExpand" runat="server" Style="display: none">
                    <asp:GridView ID="gvSelectExpand" runat="server" Width="350px" AutoGenerateColumns="false" DataKeyNames="Slab">
                        <Columns>
                            <asp:TemplateField HeaderText="Select">
                                <ItemTemplate>
                                    <asp:CheckBox ID="chkSelectExpand" runat="server" OnCheckedChanged="chkSelectExpand_CheckedChanged" AutoPostBack="true" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:BoundField DataField="Slab" SortExpression="Slab" ReadOnly="True" HeaderText="Slab" />
                            <asp:BoundField DataField="Size" SortExpression="Size" ReadOnly="True" HeaderText="Size" />
                            <asp:BoundField DataField="Sqft" SortExpression="Sqft" ReadOnly="True" HeaderText="Sqft" ItemStyle-HorizontalAlign="Right" />
                            <asp:BoundField DataField="Block" SortExpression="Block" ReadOnly="True" HeaderText="Block" ItemStyle-HorizontalAlign="Right" />
                            <asp:BoundField DataField="Totalweight" SortExpression="Totalweight" ReadOnly="True" HeaderText="Totalweight" ItemStyle-HorizontalAlign="Right" />
                        </Columns>
                        <RowStyle ForeColor="#663399" />
                        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" HorizontalAlign="Right" />
                        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
                        <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
                        <HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000" />
                    </asp:GridView>
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Select">
            <HeaderTemplate>
                <asp:CheckBox ID="chkSelectAll" runat="server" Font-Names="Verdana" Font-Size="XX-Small" Text="Select All Slabs"
                              OnCheckedChanged="chkSelectAll_CheckedChanged" AutoPostBack="true" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox ID="chkSelect" runat="server" OnCheckedChanged="chkSelect_CheckedChanged" AutoPostBack="true" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Bundle" SortExpression="Bundle" ReadOnly="True" 
            HeaderText="Bundle" />
        <asp:BoundField DataField="ItemNumber" SortExpression="ItemNumber" 
            ReadOnly="True" HeaderText="ItemNumber" />
        <asp:BoundField DataField="ItemDescription" SortExpression="ItemDescription" 
            ReadOnly="True" HeaderText="ItemDesc" />
        <asp:BoundField DataField="whse" SortExpression="whse" ReadOnly="True" 
            HeaderText="Warehouse" />
        <asp:BoundField DataField="NumSlabs" SortExpression="NumSlabs" ReadOnly="True" 
            HeaderText="NumSlabs" ItemStyle-HorizontalAlign="Right" />
        <asp:BoundField DataField="QtyTiedUp" SortExpression="QtyTiedUp" ReadOnly="True" 
            HeaderText="QtyTiedUp" ItemStyle-HorizontalAlign="Right" />
    </Columns>
    <PagerSettings Position="TopAndBottom" />
    <RowStyle ForeColor="#663399" />
    <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" HorizontalAlign="Right" />
    <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
    <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
    <HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000" />
</asp:GridView>

這是我的OnCheckedChanged代碼

CS

protected void chkSelectAll_CheckedChanged(object sender, EventArgs e)
{
    CheckBox ChkBoxHeader = (CheckBox)gvSelect.HeaderRow.FindControl("chkSelectAll");
    foreach (GridViewRow row in gvSelect.Rows)
    {
        CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkSelect");
        if (ChkBoxHeader.Checked == true)
        {
            ChkBoxRows.Checked = true;
        }
        else
        {
            ChkBoxRows.Checked = false;
        }
        bool status = ChkBoxRows.Checked;

        GridView gvSelectExpand = (GridView)row.FindControl("gvSelectExpand");
        foreach (GridViewRow gvSelectExpandRow in gvSelectExpand.Rows)
        {
            CheckBox chkSelectExpand = (CheckBox)gvSelectExpandRow.FindControl("chkSelectExpand");
            if (status)
                chkSelectExpand.Checked = true;
            else
                chkSelectExpand.Checked = false;
        }
    }
}

protected void chkSelect_CheckedChanged(object sender, EventArgs e)
{
    CheckBox ckb = (CheckBox)sender;
    GridViewRow row = (GridViewRow)ckb.NamingContainer;

    CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkSelect");
    bool status = ChkBoxRows.Checked;
    GridView gvSelectExpand = (GridView)row.FindControl("gvSelectExpand");

    foreach (GridViewRow gvSelectExpandRow in gvSelectExpand.Rows)
    {
        CheckBox chkSelectExpand = (CheckBox)gvSelectExpandRow.FindControl("chkSelectExpand");
        if (status)
            chkSelectExpand.Checked = true;
        else
            chkSelectExpand.Checked = false;
    }
}

protected void chkSelectExpand_CheckedChanged(object sender, EventArgs e)
{
    ;
}

問題是

  • 當我選中chkSelect(父網格行中的復選框)時,如果我嘗試取消選中chkSelectExpand(子網格中的復選框)中的1個或多個,它將​​進行回發並最終再次選中該子網格中的所有復選框。
  • 如果未選中chkSelect,則不會出現此問題。

但是,回發不會觸發chkSelect_CheckedChanged,我在調試中通過函數放置了一個斷點,因此可以確定這一點。

如何解決此問題? 請幫幫我,謝謝。

我找到了自己問題的答案,這與子網格的顯示方式有關。

以下代碼在父網格的單元中隱藏了真正的子網格。 我之所以稱其為真正的子網格,是因為如果我在該網格上執行相同的操作,則一切都會按預期,正確且功能正常地工作。

<asp:Panel ID="pnlSelectExpand" runat="server" Style="display: none">

我認為這與可擴展面板的工作方式有關,以下代碼

<img alt = "" style="cursor: pointer" src="Images/plus.png" id="ExpandRows" class="expand" />

標記真正的子網格cg1,可擴展網格cg2。 選中父網格的復選框時,更新cg1中的復選框也會更新cg2,但反之則不會。 意思是cg2是一個鏡像,或者是指向cg1的單向指針,只是不會更新真正的子網格。

如果有人有其他建議或答案,請糾正我。 我將發現的信息發布給那些偶然發現同一問題的人,希望他/她不會像我那樣浪費很多時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM