私はマークアップに次のコード構造を持っています:
<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' は、'Ok' と 'Cancel' という名前の 2 つのボタン (最初はすべて display:none に設定) を持つ asp リピーターを含むユーザー コントロールです。ユーザー コントロールのこのすべてのコンテンツは、ユーザー コントロールの一部でもある [呼び出し] ボタンをクリックすると、(モーダル ポップアップ エクステンダーを使用して) モーダル ポップアップとしてページに表示されます。
<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]/[キャンセル] ボタンがモーダル ポップアップに表示されます。リピーターにはアイテムのリストを含むデータソースが割り当てられ、ユーザーは変更を行い、ポップアップの 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 プロパティをサーバーに設定してサーバー コントロールにしました。ポストバック後にリピーターの値が適切に保持されるようになりました。奇妙ですが、現在働いています。