嵌套网格在插入后不会保持展开,但在PageIndexChanging事件之后不会保持展开状态

时间:2015-05-04 21:03:23

标签: javascript c# asp.net gridview nested

我有一个嵌套网格在插入后保持扩展状态。我以为我可以在PageIndexChanging事件中应用相同的逻辑,它也可以在那里工作。但事实并非如此。 这是我嵌套网格的标记:

<div id="div<%# Eval("GroupID") %>" style="display:none">
                    <asp:UpdatePanel ID="updatePnlNestedGrid" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                    <asp:GridView ID="GroupMemberGridView" runat="server" AutoGenerateColumns="false" OnRowDeleting="GroupMemberGridView_RowDeleting" 
                         OnRowCommand="GroupMemberGridView_RowCommand" CssClass="grid" ShowFooter="true" AllowPaging="true" PageSize="5"
                          onpageindexchanging="GroupMemberGridView_PageIndexChanging">
                        <Columns>
                            <asp:TemplateField HeaderText="MemberID">
                                <ItemTemplate>
                                    <asp:Label ID="mggvLblMemberID" runat="server" Text='<%# Bind("MemberID") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Member Name" ItemStyle-Wrap="false"> 
                                <ItemTemplate>
                                    <asp:Label ID="mggvLblMemberName" runat="server" Text='<%# Bind("MemberName") %>'></asp:Label>
                                </ItemTemplate>               
                                <FooterTemplate>
                                    <asp:DropDownList ID="mggvDDLMemberName" runat="server" 
                                       class="chosen-single" data-placeholder="Choose member…">
                                    </asp:DropDownList>
                                    <asp:RequiredFieldValidator ID="ReqValueDDLMemberInsert" runat="server" InitialValue="0" 
                                            ControlToValidate="mggvDDLMemberName" 
                                            ErrorMessage="Selection required." CssClass="message-error-dropdown">
                                    </asp:RequiredFieldValidator>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Active Device(s)">                   
                                <ItemTemplate>
                                    <asp:Label ID="mggvLblActiveDevice" runat="server" Text='<%# (Boolean.Parse(Eval("ActiveDevice").ToString())) ? "Yes" : "No" %>'></asp:Label>
                                </ItemTemplate>                   
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Action" ItemStyle-Wrap="false" ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                    <asp:Button ID="mggvDeleteButton" runat="server" CausesValidation="False" CommandName="Delete" 
                                        Text="Delete" CssClass="gridActionbutton"  OnClientClick="return confirm('Are you sure you want to delete this Group Member?')" >
                                    </asp:Button>
                                </ItemTemplate>                                     
                                <FooterTemplate>
                                    <asp:Button ID="mggvAddButton" runat="server" CommandName="Add" Text="Add Member" Width="90%" 
                                        CssClass="gridActionbutton"/> 
                                </FooterTemplate>
                            </asp:TemplateField>
                        </Columns>
                        <EmptyDataTemplate>
                            <tr>
                                <th>MemberID</th>
                                <th>Member Name</th>
                                <th>Active Device(s)</th>
                                <th>Action</th>
                            </tr>
                            <tr>
                                <td colspan="4" style="text-align:center;">
                                     No group members are part of this group. A group member can be added by clicking the 'Add Member' Button.
                                </td>    
                            </tr>
                            <tr>
                                <td></td>
                                <td>
                                    <asp:DropDownList ID="mggvDDLMemberName" runat="server" ClientIDMode="Static" 
                                       class="chosen-single" data-placeholder="Choose member…">
                                    </asp:DropDownList>
                                    <asp:RequiredFieldValidator ID="ReqValueDDLMemberInsertEmpty" runat="server" InitialValue="0" 
                                           ControlToValidate="mggvDDLMemberName" ValidationGroup="InsertGroupMemberValidationEmpty" 
                                            ErrorMessage="Selection required." CssClass="message-error-dropdown">
                                    </asp:RequiredFieldValidator>    
                                </td>
                                <td></td>
                                <td>
                                    <asp:Button ID="mggvAddButtonEmpty" runat="server" CommandName="Add" Text="Add Member" Width="90%" CausesValidation="true" 
                                        CssClass="gridActionbutton" ValidationGroup="InsertGroupMemberValidationEmpty">
                                    </asp:Button>
                                </td>
                            </tr>
                        </EmptyDataTemplate>
                    </asp:GridView>
                    </ContentTemplate>
                    </asp:UpdatePanel>
                </div>

这是我在代码隐藏中调用的javascript函数,用于扩展嵌套网格:

 function ExpandGrid(groupID) {             
            var div = document.getElementById(groupID);
            var img = document.getElementById('img' + groupID);
            div.style.display = "inline";
            img.src = "Images/minus.png";
            $(div + ".chosen-single").chosen("destroy");
            $(div + ".chosen-single").chosen({
                search_contains: true,
                width: "100%",
                no_results_text: "Sorry, no match!"
            });
        }

在Add Command中,我调用此脚本,插入和删除后嵌套网格仍然展开:

 protected void GroupMemberGridView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        try
        {
            if (e.CommandName.Equals("Add"))
            {                 
                //Get the Footer controls that have the new entry data
                GridView tgvGroupMember = (GridView)sender;
                Control tFooterControls = CommonMethods.getFooterControls(tgvGroupMember);
                int tiMemberID = Convert.ToInt32((tFooterControls.FindControl("mggvDDLMemberName") as DropDownList).SelectedItem.Value);
                int tiGroupID = Convert.ToInt32((tgvGroupMember.Parent.FindControl("uggvLblGroupID") as Label).Text);

                //Insert into the database
                m_pagingClient.InsertGroupMember(tiGroupID, tiMemberID);

                //Rebind the grid with the new data
                populateGroupGrid();

                UpdatePanel updatePnl = (UpdatePanel)tgvGroupMember.Parent.FindControl("updatePnlNestedGrid");
                string strJavascriptFnCall = "ExpandGrid(" + tiGroupID.ToString() + ");";
                ScriptManager.RegisterStartupScript(updatePnl, updatePnl.GetType(), "ExpandGrid", strJavascriptFnCall, true);        
            }
        }
        catch (Exception ex)
        {
            logger.ErrorException(ex.Message, ex);
            Response.Redirect("~/Error.aspx?use=" + m_strUserType);
        }
    }

我希望在PageIndexChanging事件之后保持嵌套网格打开,但是在触发此事件后网格会崩溃。

 protected void GroupMemberGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        try
        {
            GridView tgvGroupMember = (GridView)sender;
            tgvGroupMember.PageIndex = e.NewPageIndex;
            int tiGroupID = Convert.ToInt32((tgvGroupMember.Parent.FindControl("uggvLblGroupID") as Label).Text);

            populateGroupMemberGrid(tgvGroupMember, tiGroupID);

            Control tFooterControls = CommonMethods.getFooterControls(tgvGroupMember);
            DropDownList tddlRecipientNames = tFooterControls.FindControl("mggvDDLMemberName") as DropDownList;
            m_strXmlTableData = m_pagingClient.GetAllPossibleGroupMembers(m_strUserID, tiGroupID);
            DataTable tdtAllGroupMembers = CommonMethods.ParseXML(m_strXmlTableData);
            tddlRecipientNames.DataSource = tdtAllGroupMembers;
            tddlRecipientNames.DataTextField = tdtAllGroupMembers.Columns["MemberName"].ToString();
            tddlRecipientNames.DataValueField = tdtAllGroupMembers.Columns["MemberID"].ToString();
            tddlRecipientNames.ValidationGroup = "InsertMember" + tiGroupID.ToString();
            tddlRecipientNames.DataBind();
            tddlRecipientNames.Items.Insert(0, new ListItem("", "0"));//This is needed for the jquery-chosen dropdown to add data-holder text

            RequiredFieldValidator validator = (RequiredFieldValidator)tFooterControls.FindControl("ReqValueDDLMemberInsert");
            validator.ControlToValidate = ((DropDownList)tFooterControls.FindControl("mggvDDLMemberName")).GetUniqueIDRelativeTo(validator);
            validator.ErrorMessage = "Selection required.";
            validator.CssClass = "message-error-dropdown";
            validator.ValidationGroup = "InsertMember" + tiGroupID.ToString();

            Button tbtnAdd = tFooterControls.FindControl("mggvAddButton") as Button;
            tbtnAdd.ValidationGroup = "InsertMember" + tiGroupID.ToString();
            tbtnAdd.CausesValidation = true;

            UpdatePanel updatePnl = (UpdatePanel)tgvGroupMember.Parent.FindControl("updatePnlNestedGrid");
            string strJavascriptFnCall = "ExpandGrid(" + tiGroupID.ToString() + ");";
            ScriptManager.RegisterStartupScript(updatePnl, updatePnl.GetType(), "ExpandGrid", strJavascriptFnCall, true);                   
        }
        catch (Exception ex)
        {
            logger.ErrorException(ex.Message, ex);
            Response.Redirect("~/Error.aspx?use=" + m_strUserType);
        }
    }

为什么嵌套网格在索引更改事件后仍未展开,但在“添加”事件后仍然展开?

感谢。

1 个答案:

答案 0 :(得分:0)

我的嵌套网格在分页后保持展开状态。 这就是我修复它的方法...... 首先,我从javascript中删除了Sys.WebForms.PageRequestManager.getInstance().add_endRequest,以便函数看起来像这样:

function ExpandGrid(groupID) {
        var div = document.getElementById(groupID);
        alert("groupID: " + groupID + " div: " + div);
        var img = document.getElementById('img' + groupID);
        div.style.display = "inline";
        img.src = "Images/minus.png";
        $(div + ".chosen-single").chosen("destroy");
        $(div + ".chosen-single").chosen({
            search_contains: true,
            width: "100%",
            no_results_text: "Sorry, no match!"
        });

然后在PageIndexChanged中我正确地命名了参数并用单引号括起来:

string strJavascriptFnCall = "ExpandGrid('div" + tiGroupID.ToString() + "')";

最后,我将UpdatePanel 放在外面,而不是如上所示。

这让它发挥作用。 我希望这可以帮助别人。