从ChildControl中的Dropdownlist触发UpdatePanel
本文关键字:触发 UpdatePanel Dropdownlist 中的 ChildControl | 更新日期: 2023-09-27 18:23:58
这是我的情况:
页码:
<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(请参阅此问题)。
我试着用
<Triggers>
<asp:AsyncPostBackTrigger ControlID="???" EventName="SelectedIndexChanged" />
</Triggers>
但"dropDown1"answers"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)
但当Dropdown中的值发生变化时,我仍然无法让UpdatePanel触发。问题似乎是UpdatePanel在ChildControl中看不到控件,因此无法相应地设置触发器。
我该怎么做?
也许有一个技巧可以将此代码放在下拉列表中。
dropDown1.Attributes["onchange"] =
Page.ClientScript.GetPostBackEventReference(ParentUpdatePanel, "") + "; return false;";
当您更改下拉列表时,您将使用直接的javascript调用向UpdatePanel发送一个更新事件。
如果在更新面板中,则在下拉列表控件上设置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(); }
}
}
当我更改下拉列表时,标签会在没有完整帖子的情况下更新。