1

私はマークアップに次のコード構造を持っています:

        <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 プロパティをサーバーに設定してサーバー コントロールにしました。ポストバック後にリピーターの値が適切に保持されるようになりました。奇妙ですが、現在働いています。

4

3 に答える 3

0

の場合<asp:UpdatePanel ID="UpdatePanel1" runat="server">、AsyncPostbackTrigger を btnInvoke として定義します

于 2012-05-10T11:04:44.113 に答える
0

編集:以前の回答を削除しました。
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();
        }
    }
于 2012-05-10T11:07:55.530 に答える