1

我有一个包含 DropDownList 的 CompositeControl。

我已将 DropDownList 的 AutoPostBack 属性设置为 true。

在页面上,我有:

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <MyControl:Control ID="CustomControl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

我也试过设置ChildrenAsTriggers="true"UpdateMode="Always,"但都没有解决问题。

问题是UpdatePanel 没有拦截CompositeControl 的DropDownList 的回发。(更改 DropDownList 时正在执行完整的 POST)

如何让 UpdatePanel 处理回发?

谢谢!

编辑——请求的信息

Country 和 states 都是 CompositeControl 中的 DropDownLists。

country.SelectedIndexChanged += new EventHandler(country_SelectedIndexChanged);

protected void country_SelectedIndexChanged(Object sender, EventArgs e)
{
    states.DataSource = XXX;
    states.DataBind();
}
4

4 回答 4

3

好的,所以这可能不是最好的答案,但我认为您遇到的问题是 UpdatePanel 无法看到子控件的事件。好消息是,它很容易修复。假设您有一个控件(CatchMyEvent,顺便说一句,这是一个非常聪明的名字)并且它上面有一个 DropDownList。现在您希望父页面在该列表上看到 SelectedIndexChanged 事件并更新标签以匹配 SelectedItem.Text。事实上,父母真的不能这样做。所以让我们改变一下:

public partial class CatchMyEvent : System.Web.UI.UserControl
{
    public delegate void ChangedIndex(object sender, EventArgs e);
    public event ChangedIndex SelectedIndexChanged;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        dropDownListThrow.SelectedIndexChanged += new EventHandler(dropDownListThrow_SelectedIndexChanged);
        labelOutput.Text = "no";
    }

    public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
    {
        labelOutput.Text = ((DropDownList)sender).SelectedItem.Text;
        if(SelectedIndexChanged != null)
        {
            SelectedIndexChanged(sender, e);
        }
    }
}

基本上我所做的只是让控件捕获 DropDownList 的 SelectedIndexChanged 事件并触发它,以便任何父页面或控件都可以看到它。基本上我所做的就是把它传递下去。现在在父页面上,它真的很容易捕获。

您只需要添加一个带有触发器的 UpdatePanel,该触发器包含:

<asp:AsyncPostBackTrigger ControlID="catchMyEventMain" EventName="SelectedIndexChanged" />

...当然,将其添加到父页面后面的代码中:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    catchMyEventMain.SelectedIndexChanged += dropDownListThrow_SelectedIndexChanged;
}

public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{        
    labelSelectedValue.Text = ((DropDownList)sender).SelectedItem.Text;
}

其中标签是前面提到的标签。然后让魔法发生。

还有两个注意事项:

1) 不要像我在测试它时那样傻,忘记将 DropDownList 上的 AutoPostBack 属性设置为 true。

2) 确保标签在 UpdatePanel 的 ContentTemplate 中。

希望这可以帮助。

于 2008-10-22T14:17:10.620 回答
2

我在 UpdatePanel 内的 ListView 中重复了子控件(文本框和标签)。

更改文本框会导致完全(同步)回发。

我添加了 PAGE 元素(.aspx 页面的第一行):ClientIDMode="AutoID"

这为我解决了这个问题,现在只有 UpdatePanel 会根据需要刷新。

于 2013-08-29T18:31:34.700 回答
0

我在 BuildControlHierarchy 的末尾做了以下操作:

        ...
        if (DesignMode || Page == null) return;

        var sm = ScriptManager.GetCurrent(Page);
        if (sm == null)
        {
            throw new MissingFieldException("The ScriptManager is needed on the page!");
        }
        sm.RegisterAsyncPostBackControl(<control which initiates async postback>);
于 2008-12-08T12:53:00.470 回答
0

只需确保整个层次结构中的每个控件都有一个 ID 集。

看到这个问题

于 2010-08-17T09:30:47.603 回答