我在标记中有以下代码结构:
<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”(所有初始设置为 display:none)。用户控件的所有这些内容都在页面上显示为模式弹出窗口(使用模式弹出窗口扩展器),单击“调用”按钮,该按钮也是用户控件的一部分。
<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 OnClick 事件)我以 rptList.Items.Count 访问转发器以进行进一步的操作。
现在的问题。 如果用户控件在面板外,它会完美地返回正确的项目计数,但如果用户控件在面板内(如代码所示),则在回发后单击确定按钮返回的计数为“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 属性设置为 server 以使其成为服务器控件。现在它在正确回发后保留转发器的值。奇怪,但现在工作。