场景:使用UpdatePanel,然后里面放了两个联动的DropDownList,姑且称为dl1、dl2,其中在dl1的SelectedIndexChanged事件中绑定dl2.提交表单时:dl1的SelectedIndexChanged事件先被触发,然后才是提交表单Button的Click事件。重新又做了个小的例子,却未遇到此问题,感觉非常无语。另,网上已有人遇到此问题,但是遗憾的是没有确切明白的解释
参见
http://www.softwelt.com/Know/KnowDetail-3083137.html

解决方案 »

  1.   

    <asp:ScriptManager ID="ScriptManager1" runat="server">
      </asp:ScriptManager>
      <div>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
      <asp:DropDownList ID="ddlLB" runat="server" Width="15%" AutoPostBack="True" OnSelectedIndexChanged="ddlLB_SelectedIndexChanged">
      </asp:DropDownList>
      <asp:DropDownList ID="ddlChild" runat="server" Width="20%">
      </asp:DropDownList>
      </ContentTemplate>
      </asp:UpdatePanel>
      </div>   
    protected void ddlLB_SelectedIndexChanged(object sender, EventArgs e)
      {
      if(this.ddlLB.SelectedValue!=null)
      {  }
      }  
    if(!Page.IsPostBack) 

    ddlLB绑定数据

      

  2.   

    但是点击提交按钮时先是触发了ddlLB_SelectedIndexChanged事件,然后才是Button的Click事件
      

  3.   

    很正常!所有的xxxxChanged类的事件,在所有的xxxxClicked类的事件之前触发(当然通常这只有一个)。asp.net就是如此。
      

  4.   

    我们把asp.net页面处理的内部过程的源代码看看:private void ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint)
    {
        try
        {
            HttpContext context = this.Context;
            string str = null;
            if (includeStagesBeforeAsyncPoint)
            {
                if (this.IsInAspCompatMode)
                {
                    AspCompatApplicationStep.OnPageStartSessionObjects();
                }
                if (this.PageAdapter != null)
                {
                    this._requestValueCollection = this.PageAdapter.DeterminePostBackMode();
                }
                else
                {
                    this._requestValueCollection = this.DeterminePostBackMode();
                }
                string callbackControlID = string.Empty;
                if (this.DetermineIsExportingWebPart())
                {
                    if (!RuntimeConfig.GetAppConfig().WebParts.EnableExport)
                    {
                        throw new InvalidOperationException(SR.GetString("WebPartExportHandler_DisabledExportHandler"));
                    }
                    str = this.Request.QueryString["webPart"];
                    if (string.IsNullOrEmpty(str))
                    {
                        throw new InvalidOperationException(SR.GetString("WebPartExportHandler_InvalidArgument"));
                    }
                    if (string.Equals(this.Request.QueryString["scope"], "shared", StringComparison.OrdinalIgnoreCase))
                    {
                        this._pageFlags.Set(4);
                    }
                    string str3 = this.Request.QueryString["query"];
                    if (str3 == null)
                    {
                        str3 = string.Empty;
                    }
                    this.Request.QueryStringText = str3;
                    context.Trace.IsEnabled = false;
                }
                if (this._requestValueCollection != null)
                {
                    if (this._requestValueCollection["__VIEWSTATEENCRYPTED"] != null)
                    {
                        this.ContainsEncryptedViewState = true;
                    }
                    callbackControlID = this._requestValueCollection["__CALLBACKID"];
                    if ((callbackControlID != null) && (this._request.HttpVerb == HttpVerb.POST))
                    {
                        this._isCallback = true;
                    }
                    else if (!this.IsCrossPagePostBack)
                    {
                        VirtualPath path = null;
                        if (this._requestValueCollection["__PREVIOUSPAGE"] != null)
                        {
                            try
                            {
                                path = VirtualPath.CreateNonRelativeAllowNull(DecryptString(this._requestValueCollection["__PREVIOUSPAGE"]));
                            }
                            catch
                            {
                                this._pageFlags[8] = true;
                            }
                            if ((path != null) && (path != this.Request.CurrentExecutionFilePathObject))
                            {
                                this._pageFlags[8] = true;
                                this._previousPagePath = path;
                            }
                        }
                    }
                }
                if (this.MaintainScrollPositionOnPostBack)
                {
                    this.LoadScrollPosition();
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin PreInit");
                }
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_ENTER, this._context.WorkerRequest);
                }
                this.PerformPreInit();
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_INIT_LEAVE, this._context.WorkerRequest);
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End PreInit");
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin Init");
                }
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_ENTER, this._context.WorkerRequest);
                }
                this.InitRecursive(null);
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_INIT_LEAVE, this._context.WorkerRequest);
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End Init");
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin InitComplete");
                }
                this.OnInitComplete(EventArgs.Empty);
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End InitComplete");
                }
                if (this.IsPostBack)
                {
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "Begin LoadState");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_ENTER, this._context.WorkerRequest);
                    }
                    this.LoadAllState();
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_VIEWSTATE_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End LoadState");
                        this.Trace.Write("aspx.page", "Begin ProcessPostData");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_ENTER, this._context.WorkerRequest);
                    }
                    this.ProcessPostData(this._requestValueCollection, true);
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_POSTDATA_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End ProcessPostData");
                    }
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin PreLoad");
                }
                this.OnPreLoad(EventArgs.Empty);
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End PreLoad");
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin Load");
                }
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_ENTER, this._context.WorkerRequest);
                }
                this.LoadRecursive();
                if (EtwTrace.IsTraceEnabled(5, 4))
                {
                    EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_LOAD_LEAVE, this._context.WorkerRequest);
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End Load");
                }
      

  5.   


                if (this.IsPostBack)
                {
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "Begin ProcessPostData Second Try");
                    }
                    this.ProcessPostData(this._leftoverPostData, false);
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End ProcessPostData Second Try");
                        this.Trace.Write("aspx.page", "Begin Raise ChangedEvents");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_ENTER, this._context.WorkerRequest);
                    }
                    this.RaiseChangedEvents();
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_POST_DATA_CHANGED_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End Raise ChangedEvents");
                        this.Trace.Write("aspx.page", "Begin Raise PostBackEvent");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_ENTER, this._context.WorkerRequest);
                    }
                    this.RaisePostBackEvent(this._requestValueCollection);
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RAISE_POSTBACK_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End Raise PostBackEvent");
                    }
                }
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin LoadComplete");
                }
                this.OnLoadComplete(EventArgs.Empty);
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End LoadComplete");
                }
                if (this.IsPostBack && this.IsCallback)
                {
                    this.PrepareCallback(callbackControlID);
                }
                else if (!this.IsCrossPagePostBack)
                {
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "Begin PreRender");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_ENTER, this._context.WorkerRequest);
                    }
                    this.PreRenderRecursiveInternal();
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_PRE_RENDER_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End PreRender");
                    }
                }
            }
            if ((this._asyncInfo == null) || this._asyncInfo.CallerIsBlocking)
            {
                this.ExecuteRegisteredAsyncTasks();
            }
            this._request.ValidateRawUrl();
            if (includeStagesAfterAsyncPoint)
            {
                if (this.IsCallback)
                {
                    this.RenderCallback();
                }
                else if (!this.IsCrossPagePostBack)
                {
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "Begin PreRenderComplete");
                    }
                    this.PerformPreRenderComplete();
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End PreRenderComplete");
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.BuildPageProfileTree(this.EnableViewState);
                        this.Trace.Write("aspx.page", "Begin SaveState");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_ENTER, this._context.WorkerRequest);
                    }
                    this.SaveAllState();
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End SaveState");
                        this.Trace.Write("aspx.page", "Begin SaveStateComplete");
                    }
                    this.OnSaveStateComplete(EventArgs.Empty);
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End SaveStateComplete");
                        this.Trace.Write("aspx.page", "Begin Render");
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_ENTER, this._context.WorkerRequest);
                    }
                    if (str != null)
                    {
                        this.ExportWebPart(str);
                    }
                    else
                    {
                        this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));
                    }
                    if (EtwTrace.IsTraceEnabled(5, 4))
                    {
                        EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_LEAVE, this._context.WorkerRequest);
                    }
                    if (context.TraceIsEnabled)
                    {
                        this.Trace.Write("aspx.page", "End Render");
                    }
                    this.CheckRemainingAsyncTasks(false);
                }
            }
        }
        catch (ThreadAbortException exception)
        {
            HttpApplication.CancelModuleException exceptionState = exception.ExceptionState as HttpApplication.CancelModuleException;
            if (((!includeStagesBeforeAsyncPoint || !includeStagesAfterAsyncPoint) || ((this._context.Handler != this) || (this._context.ApplicationInstance == null))) || ((exceptionState == null) || exceptionState.Timeout))
            {
                this.CheckRemainingAsyncTasks(true);
                throw;
            }
            this._context.ApplicationInstance.CompleteRequest();
            Thread.ResetAbort();
        }
        catch (ConfigurationException)
        {
            throw;
        }
        catch (Exception exception3)
        {
            PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_DURING_REQUEST);
            PerfCounters.IncrementCounter(AppPerfCounter.ERRORS_TOTAL);
            if (!this.HandleError(exception3))
            {
                throw;
            }
        }
    }
    你会看到,首先执行this.RaiseChangedEvents(),然后才是执行this.RaisePostBackEvent(this._requestValueCollection)。
      

  6.   

    还要请教4楼有什么有效办法确保提交时二级的下拉列表的SelectedIndexChanged事件不会被触发?