【问题标题】:SelectedIndexChanged for DropDownList in ASP.NET firing in the wrong orderASP.NET 中 DropDownList 的 SelectedIndexChanged 以错误的顺序触发
【发布时间】:2011-04-04 00:54:57
【问题描述】:

我的代码中有以下 DropDownList 以错误的顺序触发:

public class MyWebpart : WebPart
{
    private DropDownList dropDown = new DropDownList();

    private string selectedValue;

    public Webpart()
    {
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        dropDown.AutoPostBack = true;
        dropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged);
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.EnsureChildControls();
    }

    protected void DropDown_SelectedIndexChanged(Object sender, EventArgs e)
    {
        selectedValue - dropDown.SelectedValue;
    }

    protected void override void CreateChildControls()
    {
        base.CreateChildControls();
        // create some stuff here
    }

我期待当下拉选择更改时,DropDown_SelectedIndexChanged 将首先被调用,但它经历了从 OnInit、OnLoad、CreateChildControls 到 DropDown_SelectedIndexChanged 的​​整个生命周期。

我错过了什么吗?如何先获取 DropDown_SelectedIndexChanged 调用?

【问题讨论】:

  • 你的问题和C#有什么关系?
  • 正如 Tahbaza 所说,生命周期行为不能轻易改变。也许您可以详细说明为什么这个生命周期是一个问题?

标签: c# asp.net web-parts


【解决方案1】:

您无法更改页面生命周期。您可以做的是检查 Page.IsPostBack 是否仅在首次加载时执行适当的操作,或者您可以创建一个 Web 服务并从 javascript 调用该 Web 服务以在 js 中执行您 selectedindexchanged 的​​操作,而不是回发整个页面。

祝你好运!

【讨论】:

  • 所以它是因为生命周期......我一定把它和别的东西混淆了。回到问题:我确实注意到页面刷新后 DropDownList 的 SelectedValue 没有保存。有什么东西可以用来保存它,以便在选择更改后我可以获得值并对其进行处理?谢谢。
  • dropDown.SelectedValue 应包含已发布的下拉列表的当前值。请确保在检查所选值的代码有机会检查它之前,您没有重新绑定下拉列表、清除它或页面加载中的其他内容或其他事件。
  • 我设法在 OnLoad 方法中检索到下拉列表的值,但不是 CreateChildControls。此外,在我的场景中,OnLoad 似乎在 CreateChildControls 之后运行。
【解决方案2】:

这是你要调用的方法

protected void override void CreateChildControls()
{
    base.CreateChildControls();
    dropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged);
}

【讨论】:

    【解决方案3】:

    dropDown.AutoPostBack = true; 属性会触发回发,从而使其经历页面生命周期事件。

    最好的办法是至少将if(!IsPostBack) { } 签入 OnLoad 方法,以过滤掉您不希望在回发时发生的事件。

    您可以编写一些 Javascript 函数并将其应用于下拉列表的“onchange”事件。但是您需要关闭自动回发,它会发生在客户端而不是服务器上。

    【讨论】:

      【解决方案4】:

      无法从CreateChildControls() 访问回发值;您必须等到OnLoad 事件才能将回发的私有视图状态加载到控件中。

      OnInt事件调用EnsureChildControls();回发的值随后在 OnLoad 事件的控件中可用 - 注意:EnsureChildControls() 调用 CreateChildControls()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多