0

ItemTemplate に入力コントロール (ListBox、TextBox、CalendarExtender など) を ItemDataBound に追加する PlaceHolder が含まれているリピーターがあります。

<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 の 1 つから (TextChanged で) asyncpostback を生成するにはどうすればよいですか?

コントロールは動的に作成され、特定の条件下でのみポストバックを作成したいので、コード ビハインドから行う必要があります。

私が試してみました:

  1. OnItemCommand (ただし、これはボタンのみのようです)
  2. ScriptManager.RegisterAsyncPostBackControl (TextChanged では何もしていないようです)
  3. UpdatePanel.Triggers.Add(new AsyncPostBackTrigger ...) (リピーター内にあるため、TextBox を見つけることができません)
4

1 に答える 1

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 で、動的に作成しているため、viewstate からすべてを再バインドする必要があります。これは、作成した一意の 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);
}
于 2013-02-15T19:14:45.903 に答える