从中继器内的控件创建异步回发
本文关键字:异步 创建 控件 中继器 | 更新日期: 2023-09-27 17:59:28
我有一个中继器,其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>
如何从中继器内的其中一个TextBox(在TextChanged上)生成异步回发?
控件是动态创建的,我只想在特定条件下创建回发,所以它需要从代码后面完成。
我试过:
- OnItemCommand(但这似乎只是用于按钮)
- ScriptManager.RegisterAsyncPostBackControl(似乎对TextChanged没有任何作用)
- UpdatePanel.Triggers.Add(新的AsyncPostBackTrigger…)(无法找到位于中继器内的TextBox)
在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);
}