Триггер UpdatePanel из выпадающего списка в ChildControl - PullRequest
2 голосов
/ 09 февраля 2012

Это моя ситуация:

Страница:

<asp:UpdatePanel ID="updatePanel1" runat="server" ChildrenAsTriggers="true">
  <ContentTemplate>
    ...
    <uc:ChildControl ID="ucChild" runat="server" />
    ...
  </ContentTemplate>
</asp:UpdatePanel>

ChildControl:

...
<asp:DropDownList id="dropDown1" runat="server" />
...

Я хочу обновить UpdatePanel (асинхронно) на странице, когда изменяется выбор DropDownList в ChildControl. Я пробовал AutoPostBack = "true", но это всегда приводит к полному PostBack страницы (см. этот вопрос ).

Я пытался использовать

<Triggers>
    <asp:AsyncPostBackTrigger ControlID="???" EventName="SelectedIndexChanged" />
</Triggers>

но ни «dropDown1», ни «ucChild.dropDown1» не работали в качестве значений для ControlID.

Я также попытался передать ссылку на UpdatePanel в ChildControl и добавить триггер следующим образом:

protected override void OnPreRender(EventArgs e)
{
    if (ParentUpdatePanel != null)
    {
        AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
        trigger.ControlID = dropDown1.ID;
        trigger.EventName = "SelectedIndexChanged";
        ParentUpdatePanel.Triggers.Add(trigger);
    }
    base.OnPreRender(e);
}

(также пробовал с dropDown1.ChildID)

Но я все еще не могу заставить UpdatePanel срабатывать при изменении значения в раскрывающемся списке. Кажется, проблема в том, что UpdatePanel не видит элемент управления в ChildControl и, следовательно, не может соответствующим образом установить триггер.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Может быть, с помощью хитрости, поместив этот код в раскрывающийся список.

dropDown1.Attributes["onchange"] =   
Page.ClientScript.GetPostBackEventReference(ParentUpdatePanel, "") + "; return false;";

При изменении раскрывающегося списка вы отправляете событие обновления в UpdatePanel с помощью прямого вызова javascript.

0 голосов
/ 09 февраля 2012

Настройка AutoPostBack = True в элементе управления раскрывающегося списка не должна обновлять всю страницу, если она находится на панели обновлений.

Я создал простой пример:

default.aspx:

<form id="form1" runat="server">
<div>
    <asp:ScriptManager runat="server"></asp:ScriptManager>
    <asp:UpdatePanel ID="up" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
        <ContentTemplate>            
            <uc:UserControl ID="ucChild" runat="Server"></uc:UserControl>
            <asp:Label ID="lbl" runat="server"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
</form>

default.aspx.cs (код позади):

public partial class _default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        lbl.Text = ucChild.value;
    }   
}

UserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl.ascx.cs" Inherits="somenamespace.UserControl" %>
<asp:DropDownList runat="server" ID="ddl" AutoPostBack="true">
    <asp:ListItem Text="1" Value="1"></asp:ListItem>
    <asp:ListItem Text="2" Value="2"></asp:ListItem>
</asp:DropDownList>

UserControl.ascx.cs (код позади):

public partial class UserControl : System.Web.UI.UserControl {
    public string value {
        get { return ddl.SelectedValue.ToString(); }
    }
}

Когда я изменяю выпадающий список, ярлык обновляется без полной обратной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...