【发布时间】:2015-05-04 21:03:22
【问题描述】:
我有一个嵌套网格在插入后保持展开状态。我想我可以在 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!"
});
}
在添加命令中,我调用了这个脚本,嵌套网格在插入和删除后保持扩展:
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);
}
}
为什么嵌套网格在索引更改事件后没有保持展开状态,但在“添加”事件后仍然保持展开状态?
谢谢。
【问题讨论】:
-
你试过用
PageIndexChanged代替吗? -
我试过两者都用,但没有用。我使用 PageIndexChanging 设置新索引,使用 PageIndexChanged 更新下拉列表并调用 javascript Expand 函数。你是这个意思吗?
标签: javascript c# asp.net gridview nested