从ChildControl中的Dropdownlist触发UpdatePanel

时间:2012-02-09 12:32:44

标签: c# asp.net ajax drop-down-menu updatepanel

这是我的情况:

页:

<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" />
...

当ChildControl中DropDownList的选择发生变化时,我想在页面中更新UpdatePanel(异步)。我尝试过AutoPostBack =“true”,但这总是导致页面的完整PostBack(参见this question)。

我尝试使用

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

但“dropDown1”和“ucChild.dropDown1”都不是ControlID的值。

我还尝试将UpdatePanel的引用传递给ChildControl,并按以下方式添加Trigger:

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)

但是当Dropdown中的值发生变化时,我仍然无法触发UpdatePanel。问题似乎是UpdatePanel无法在ChildControl中看到Control,因此无法相应地设置Trigger。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

可能有一个技巧将此代码放在下拉列表中。

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

更改下拉列表时,使用直接javascript调用向UpdatePanel发送更新事件。

答案 1 :(得分:0)

在下拉列表控件中设置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(); }
    }
}

当我更改下拉列表时,标签会在没有完整回发的情况下进行更新。