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”是一个用户控件,它包含一个带有两个按钮的 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 以使其成为服务器控件。现在它在正确回发后保留转发器的值。奇怪,但现在工作。

4

3 回答 3

1

这是我得到的奇怪解决方案,我用标签封闭了网格和中继器,并将 runat 属性设置为 server 以使其成为服务器控件。现在它在正确回发后保留转发器的值。奇怪,但现在工作。

于 2013-08-20T06:49:27.213 回答
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 回答