我在标记中有以下代码结构:
<asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
<asp:GridView ID="grd1" runat="server" AutoGenerateColumns="true">
</asp:GridView>
<myControl:RepeaterUserControl ID="rpt"></myControl:RepeaterUserControl>
</asp:Panel>
该面板用于控制可见性(目前始终设置为true)。控件'RepeaterUserControl'是一个用户控件,它包含一个asp转发器,带有两个名为'Ok'和'Cancel'的按钮(所有初始设置显示:无)。所有这些用户控件的内容在页面上显示为模式弹出窗口(使用模式弹出扩展器),单击“调用”按钮,该按钮也是用户控件的一部分。
<div id="div1" runat="server">
<ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
TargetControlID="btnDummyInvoker" CancelControlID="imbClose" PopupDragHandleControlID="divDialogTitle"
BackgroundCssClass="modalBackground">
</ajax:ModalPopupExtender>
<div style="height: 4px;">
</div>
<asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke"
Width="90px" />
<div style="display: none; position: absolute;">
<asp:Button ID="Button2" runat="server" />
</div>
<div id="div2" runat="server" style="display: none;">
<asp:Repeater ID="rptList" runat="server">
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
<asp:Button ID="btnCancel" runat="server" />
</div>
</div>
因此,在网格下方,用户在页面上看到一个按钮(Invoke),点击其中的转发器控件和Ok / Cancel按钮显示在模态弹出窗口中。转发器被分配一个数据源,其中包含项目列表,用户进行更改以及弹出窗口的ok单击,从后面的代码(ok OnClick事件)我访问转发器作为rptList.Items.Count进行进一步的操作。
现在问题。 如果用户控件在面板之外,则它会完美地返回正确的项目数,但如果面板内的userControl(如代码所示),则在回发后单击ok按钮返回的计数为“0”。 为什么转发器会在这种情况下失去其状态?
更新:从代码隐藏中添加代码段,如果它有助于解决问题
//This is from the user control code
protected void btnInvoke_Click(object sender, EventArgs e)
{
rptList.DataSource = listToBeBoundToRepeater;
rptList.DataBind();
modalPopupExtender.Show();
}
//This is from the user control code
protected void btnOk_Click(object sender, EventArgs e)
{
for (int itemIndex = 0; itemIndex < rptList.Items.Count; itemIndex++)
{
// business logiv
}
}
对于我所描述的案例的回发,rptList.Items.Count对我来说是0。
update2: 这是我得到的奇怪的解决方案,我将网格和转发器用标签包围,并将runat属性设置为服务器以使其成为服务器控件。现在它在回发后坚持转发器的价值。奇怪,但现在正在工作。
答案 0 :(得分:1)
这是我得到的奇怪解决方案,我将网格和转发器用标签包围,并将runat属性设置为服务器以使其成为服务器控件。现在它在回发后坚持转发器的价值。奇怪,但现在正在工作。
答案 1 :(得分:0)
for <asp:UpdatePanel ID="UpdatePanel1" runat="server">
,将AsyncPostbackTrigger定义为btnInvoke
答案 2 :(得分:0)
编辑:删除了上一个答案。
我尝试使用包含usercontrol的主面板尽可能模拟您的问题,该控件包含一个与ajaxcontroltoolkit一起显示的转发器。
虽然我的转发器项目数总是正确的。
容器页面:
<%@ Register TagPrefix="a" TagName="test" Src="cc.ascx" %>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
<a:test runat="server" ID="test"></a:test>
</asp:Panel>
</asp:Content>
用户控制cc aspx:
<%@ Register TagPrefix="ajax" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit, Version=4.1.60501.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" %>
<div id="div1" runat="server">
<ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
TargetControlID="btnDummyInvoker"
BackgroundCssClass="modalBackground">
</ajax:ModalPopupExtender>
<asp:Button runat="server" style="display:none" ID="btnDummyInvoker"/>
<div style="height: 4px;">
</div>
<asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke" Width="90px" />
<div style="display: none; position: absolute;">
<asp:Button ID="Button2" runat="server" />
</div>
<div id="divDialog" runat="server" style="display: none;">
<asp:Repeater ID="rptList" runat="server">
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
<asp:Button ID="btnCancel" runat="server" />
</div>
<asp:TextBox runat="server" ID="result"></asp:TextBox>
</div>
后面的用户控制代码:
public partial class cc : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnInvoke_Click(object sender, EventArgs e)
{
var list = new List<Data>();
list.Add(new Data { DisplayText = "one" });
list.Add(new Data { DisplayText = "two" });
rptList.DataSource = list;
rptList.DataBind();
ModalPopupExtender1.Show();
}
protected void btnOk_Click(object sender, EventArgs e)
{
var count = rptList.Items.Count;
result.Text = count.ToString();
}
}