ASP.NET 使用带有展开/折叠功能的嵌套、可编辑 GridView 的 JQuery

Posted

技术标签:

【中文标题】ASP.NET 使用带有展开/折叠功能的嵌套、可编辑 GridView 的 JQuery【英文标题】:ASP.NET Using JQuery with nested, editable GridViews with expand/colapse features 【发布时间】:2020-06-08 11:44:07 【问题描述】:

我的应用程序的一部分使用嵌套的GridViews 来显示数据。我有客户的订单,每个订单包含 1 个或多个产品。现在,为了向用户展示数据,我使用了订单数据GridView,每行都有一个按钮,可以展开/折叠子Gridview

在设计这个时,我遵循了这个页面上的教程:

https://www.aspsnippets.com/Articles/ASPNet-Nested-GridViews-GridView-inside-GridView-with-Expand-and-Collapse-feature.aspx

做了一些修改,因为我的情况有点不同(例如,我不使用数据库,因为数据是从外部 API 导入的)。

但是,问题在于,在原始代码中,子 GridView 数据只显示,而在我的解决方案中,它有一些 DropDownLists 允许用户编辑数据:

<asp:GridView ID="MainTable" runat="server" OnDataBound="MainTable_DataBound" AutoGenerateColumns="false" OnRowCommand="MainTable_RowCommand" class="w3-table w3-centered">
        <HeaderStyle CssClass="w3-blue" />
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <a class="w3-btn w3-blue button" id="plus">+</a>
                    <asp:Panel ID="pnlOrders" runat="server" Style="display: none">
                        <asp:GridView ID="ProductsTable" runat="server" OnRowDataBound="ProductsTable_RowDataBound" AutoGenerateColumns="false" class="w3-table w3-striped">
                            <Columns>
                                <asp:BoundField DataField="Name" HeaderText="Nazwa" />
                                <asp:BoundField DataField="Indexer" Visible="false" />
                                <asp:TemplateField HeaderText="Parametr 1">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="DropDownList1" runat="server" class="w3-select w3-border"></asp:DropDownList>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Parametr 2">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="DropDownList2" runat="server" class="w3-select w3-border"></asp:DropDownList>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Parametr 3">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="DropDownList3" runat="server" class="w3-select w3-border"></asp:DropDownList>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Usuń">
                                    <ItemTemplate>
                                        <a class="w3-btn w3-blue verify">V</a>
                                    </ItemTemplate>
                                </asp:TemplateField>
                            </Columns>
                        </asp:GridView>
                    </asp:Panel>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="ID" HeaderText="ID" />
            <asp:BoundField DataField="Client" HeaderText="Klient" />
            <asp:BoundField DataField="Phone" HeaderText="Telefon" />
            <asp:BoundField DataField="Comment" HeaderText="Komentarz" />
            <asp:TemplateField HeaderText="Zatwierdź">
                <ItemTemplate>
                    <asp:Button class="w3-btn w3-blue" Text="Zatwierdź" runat="server" CommandName="Verify" CommandArgument="<%# Container.DataItemIndex %>" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

现在,原始代码中使用的 JQuery 创建了子 GridView 的副本,当用户单击“-”按钮时,该副本将被删除。因此,我无法在代码中访问DropDownLists,并且不会保存用户所做的更改。我还发现子 GridView.verify 类)中的按钮无法正常工作(但是,这可能是我的错,因为我不太熟悉 JQuery)。

$(document).ready(function () 
            $(".button").on("click", function () 
                if ($(this).attr('id') == "plus") 
                    $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>");
                    $(this).html("-");
                    $(this).attr('id', 'minus');
                
                else 
                    $(this).html("+");
                    $(this).closest("tr").next().remove();
                    $(this).attr('id', 'plus');
                
            );
            $(".verify").on("click", function () 
                $(this).closest("tr").css("background-color", "#ffffff");
            );
        );

所以我的问题是 - 如何保持应用程序的当前外观和页面设计(在单元格外部打开子 GridView),同时仍然能够在后面的代码中访问 DropDownLists?可以用 JQuery 来做吗?如果没有,您对如何解决这个问题还有其他想法吗?

[编辑] 以下是一些外观图片:

【问题讨论】:

【参考方案1】:

您也可以使用 hide() 代替 remove()。像这样:

 $(this).html("+");
 $(this).closest("tr").next().hide();
 $(this).attr('id', 'plus');

【讨论】:

在这种情况下,使用 hide() 方法将导致每次用户单击“+”按钮时都会添加新的表行。如果我解决了主要问题——每次都创建一个新对象,而不是使用现有的对象,同时仍然保持当前的设计——hide() 方法会更有用

以上是关于ASP.NET 使用带有展开/折叠功能的嵌套、可编辑 GridView 的 JQuery的主要内容,如果未能解决你的问题,请参考以下文章

asp.net MVC 中嵌套表视图中级别 3 子子项的问题

带有展开和折叠功能的 Android 视频视图

使用可折叠/可扩展行创建 gridview C# asp.net

如何以角度动态创建 n 级嵌套展开/折叠组件

在Angular 6中折叠/展开嵌套的div

时间轴组件(Vue+element)