[英]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_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.