Имам следната структура на кода в маркирането:
<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>
И така, под решетката потребителят вижда бутон (Извикване) на страницата, при щракване върху който контролата на повторителя и бутоните Ok/Отказ се показват в модалния изскачащ прозорец. На ретранслатора е присвоен източник на данни, който съдържа списъка с елементи, потребителят прави промени и при 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 на сървър, за да го направя сървърна контрола. Сега стойностите на повторителя след обратното изпращане се запазват правилно. Странно, но сега работи.