【问题标题】:Creating an asyncpostback from a control inside a repeater从转发器内的控件创建异步回发
【发布时间】:2013-01-31 19:20:08
【问题描述】:

我有一个中继器,它的 ItemTemplate 包含一个 PlaceHolder,我在 ItemDataBound 上添加输入控件(ListBox、TextBox、CalendarExtender 等):

<asp:UpdatePanel ID="ReportParameterUpdatePanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:Repeater ID="ReportParameterEditRepeater" OnItemDataBound="ReportParameterEditRepeater_ItemDataBound" runat="server">
            <ItemTemplate>
                <asp:PlaceHolder runat="server" ID="ParameterEntryPlaceholder"></asp:PlaceHolder>
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

如何从中继器内的这些文本框之一生成异步回发(在 TextChanged 上)?

控件是动态创建的,我只想在特定条件下创建回发,所以需要从后面的代码中完成。

我试过了:

  1. OnItemCommand(但这似乎只是用于按钮)
  2. ScriptManager.RegisterAsyncPostBackControl(似乎对 TextChanged 没有任何作用)
  3. UpdatePanel.Triggers.Add(new AsyncPostBackTrigger ...)(无法在中继器中找到 TextBox)

【问题讨论】:

  • 您是在OnLoadOnInit 中进行动态更改吗?事件必须在OnInit 中设置,否则它们不会触发。
  • 谢谢 - 这是我的错误!

标签: c# asp.net updatepanel postback repeater


【解决方案1】:

在 ReportParameterEditRepeater_ItemDataBound 中,您需要为每个控件分配一个唯一的 ID,然后绑定文本更改事件。然后我喜欢将它们存储在会话中。然后将其添加到您的占位符。 以下是我在我的网站中为按钮点击事件所做的事情:

TemplateControls_Headline ctrl = (TemplateControls_Headline)LoadControl("~/Controls/TemplateHeadline.ascx");
ctrl.ID = "MyCtrl_" + CMSSession.Current.AddedTemplateControls.Count;
ctrl.Remove.Click += new EventHandler(RemoveItem_OnClick);

MySession.Current.AddedTemplateControls.Add((Control)ctrl);

PlaceHolder ph = accAddTemplates.FindControl("phAddTemplateControlsArea") as PlaceHolder;
ph.Controls.Add(ctrl);

然后,在页面的 OnInit 中,您必须重新绑定视图状态中的所有内容,因为您正在动态创建它们,这就是您创建的唯一 id 的来源(这主要用于回发):

protected override void OnInit(EventArgs e)
{
    PlaceHolder ph = accAddTemplates.FindControl("phAddTemplateControlsArea") as PlaceHolder;

    int counter = 0;

    foreach (UserControl ctrl in MySession.Current.AddedTemplateControls)
    {
        ctrl.ID = "MyCtrl_" + counter;
        ctrl.Remove.CommandArgument = counter.ToString();
        ctrl.Remove.Click += new EventHandler(RemoveItem_OnClick);
        counter++;
        ph.Controls.Add(ctrl);
    }

    base.OnInit(e);
}

【讨论】:

  • 太好了,非常感谢这个例子。覆盖 OnLoad 成功了。
  • +1 有趣。我从来没有想过在会话中放置一个控件...什么是 MySession,什么是 AdditionalTemplateControls? (我总是在每个页面循环中重新创建控件)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多