2010-03-09 81 views
0

是什麼問題有關asp.net事件處理

<asp:DropDownList ID="Combo" OnSelectedIndexChanged="Change" AutoPostBack="True" runat="server"/> 

<asp:DropDownList ID="Combo" SelectedIndexChanged="Change" AutoPostBack="True" runat="server"/> 

之間的區別?

而且AutoPostBack =「True」屬性始終需要嗎?

Iam問,因爲它似乎我的OnSelectedIndexChanged事件似乎總是被調用兩次(編輯:當我使用SelectedIndexChanged,處理程序不會被調用)。

這是爲什麼?

編輯: 這些在我從兩次被觸發的事件中獲得的堆棧軌跡。後者似乎是從某種計時器中調用的。我從來沒有創造過一個時間,它必須是一些系統。

MyApp!MyNamespace.ListenControl.AuswahlGeändert(object sender = {System.Web.UI.WebControls.DropDownList}, System.EventArgs e = {System.EventArgs}) Zeile 44 C# 
    System.Web.dll!System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(System.EventArgs e = {System.EventArgs}) + 0x70 Bytes 
    System.Web.dll!System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent() + 0x87 Bytes 
    System.Web.dll!System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() + 0xb Bytes  
    System.Web.dll!System.Web.UI.Page.RaiseChangedEvents() + 0xa6 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint = true, bool includeStagesAfterAsyncPoint = true) + 0x5ce Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint = true) + 0x84 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x51 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) + 0x16 Bytes 
    System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0x32 Bytes 
    App_Web_bm-nkhnz.dll!ASP.kfzpage_aspx.ProcessRequest(System.Web.HttpContext context = {System.Web.HttpContext}) + 0x26 Bytes C# 
    System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0xb6 Bytes 
    System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool completedSynchronously = true) + 0x4c Bytes 
    System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x133 Bytes 

    System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0x7c Bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr = {Microsoft.VisualStudio.WebHost.Request}) + 0x17c Bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x63 Bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 Bytes 
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x165 Bytes 
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn = {System.Runtime.Remoting.Proxies.__TransparentProxy}) + 0x6c Bytes 
    [Anwendungsdomänenübergang] 
    WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0x7d Bytes 
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) + 0x2f Bytes 
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f Bytes  
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0x53 Bytes 
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) + 0x59 Bytes  

這是當事件被稱爲第二時間:

MyApp!MyNamespace.ListenControl.AuswahlGeändert(object sender = {System.Web.UI.WebControls.DropDownList}, System.EventArgs e = {System.EventArgs}) Zeile 44 C# 
     System.Web.dll!System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(System.EventArgs e = {System.EventArgs}) + 0x70 Bytes 
     System.Web.dll!System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent() + 0x87 Bytes 
     System.Web.dll!System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() + 0xb Bytes  
     System.Web.dll!System.Web.UI.Page.RaiseChangedEvents() + 0xa6 Bytes 
     System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint = true, bool includeStagesAfterAsyncPoint = true) + 0x5ce Bytes 
     System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint = true) + 0x84 Bytes 
     System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x51 Bytes 
     System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) + 0x16 Bytes 
     System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0x32 Bytes 
     App_Web_bm-nkhnz.dll!ASP.kfzpage_aspx.ProcessRequest(System.Web.HttpContext context = {System.Web.HttpContext}) + 0x26 Bytes C# 
     System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0xb6 Bytes 
     System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool completedSynchronously = true) + 0x4c Bytes 
     System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x133 Bytes 

     System.Web.dll!System.Web.HttpApplication.ResumeStepsFromThreadPoolThread(System.Exception error) + 0x25 Bytes 
     System.Web.dll!System.Web.HttpApplication.AsyncEventExecutionStep.ResumeStepsWithAssert(System.Exception error) + 0x28 Bytes  
     System.Web.dll!System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(System.IAsyncResult ar) + 0x84 Bytes 
     System.Web.dll!System.Web.HttpAsyncResult.Complete(bool synchronous, object result, System.Exception error, System.Web.RequestNotificationStatus status) + 0x3e Bytes 
     System.Web.dll!System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(object state) + 0x169 Bytes 
     mscorlib.dll!System.Threading._TimerCallback.TimerCallback_Context(object state) + 0x2f Bytes 
     mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData) + 0x51 Bytes 
     [Übergang von Systemeigen zu Verwaltet] 
     [Übergang von Verwaltet zu Systemeigen] 
     mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x67 Bytes  
     mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x45 Bytes  
     mscorlib.dll!System.Threading._TimerCallback.PerformTimerCallback(object state) + 0x6b Bytes  
     [Anwendungsdomänenübergang] 
+0

我對第二個例子的工作感到非常驚訝,因爲Intellisense只給了我第一個例子。 – Greg 2010-03-09 15:21:47

+0

我現在發現第二個根本不工作。沒有錯誤,但也沒有事件處理程序調用 – codymanix 2010-03-09 15:35:42

回答

3

之間有什麼區別[ASP:DropDownList的1]和[ASP:DropDownList的2]?

SelectedIndexChanged不是asp:DropDownList標記的有效屬性,所以ASP.NET不會對它做任何事情。

我問,因爲它似乎我 OnSelectedIndexChanged事件似乎總是 被稱爲兩次......爲什麼 會這樣?

您的堆棧跟蹤表明第二個事件調用是由重入線程引起的。您是從網頁運行任何異步委託,使用客戶端回調還是使用第三方控件?

+0

Iam使用微軟的ajax庫。我不知道我怎麼可能意外地包含異步委託或客戶端回調而不知道它。 – codymanix 2010-03-09 15:39:08

+0

謝謝,現在我找到了它,因爲你讓我走上了正確的軌道。 Iam使用導致問題的AJAX ListSearchExtender。現在的問題是如何解決這個問題.. – codymanix 2010-03-09 15:51:15

+1

Hooray!你確定有什麼需要解決的嗎? 'ListSearchExtender'改變了下拉選擇:當它這樣做時,調用'OnSelectedIndexChanged'是否合適? – 2010-03-09 15:56:35

1

AutoPostBack屬性意味着控制的選擇將導致的柱。如果它沒有設置爲true,那麼你將需要做其他事情來提交表單(即點擊按鈕)

OnSelectedIndexChanged事件的可能性是檢查以確保您沒有添加事件處理器兩次。如果你已經在ASPX中定義了它,那麼不要將它添加到代碼隱藏中,反之亦然。

+0

是的我確信我添加的只是在我的aspx文件 – codymanix 2010-03-09 15:14:15

+0

我以前發生過幾次這種事。一定不要在ASPX和Codebehind中設置,否則它可能會搞砸頁面...並嘗試將其調用兩次。你真的只需要一個或另一個(我更喜歡後面的代碼)。 – Rob 2010-03-09 15:14:42

+0

我編輯了我的問題。我發現某種timercallback導致了這種情況,但它不是來自我的。 – codymanix 2010-03-09 15:25:17

0

如果我正確地記得名爲OnSomething的事件更多用於內部使用(就像創建子類一樣,您將覆蓋OnSelectedIndexChanged)。所以我認爲使用SelectedIndexChange是個好習慣。

至於AutoPostBack,這是爲了確保頁面在項目發生更改時回發給服務器。如果未設置爲true,那麼您(服務器)將永遠不會在用戶單擊某個提交按鈕或執行其他導致和autopostback(在另一個控件上)之前更改。

編輯:

還有一兩件事,如果我不記得一個錯誤的方法OnSomething通常是調用事件東西(EDIT2的一個,這似乎不是在ASP中標記語言的情況下.NET(html)。在html中的OnSomething =「」映射到Something事件似乎,我的壞)。所以如果你寫一個名字可以改變的類「人」,你會這樣做:

public class Person 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; OnNameChanged(new EventArgs()); } 
    } 

    protected OnNameChanged(EventArgs args) 
    { 
     if(NameChanged != null) 
      NameChanged(this, args); 
    } 

    public event EventHandler NameChanged; 
} 

或類似的東西。

微軟的例子可能比我的更好,雖然:-P:http://msdn.microsoft.com/en-us/library/5z57dxz2.aspx

+0

我試過沒有「On」,只是用了SelectedIndexChanged,但是這個處理程序根本沒有被調用。此外,你給的頁面是關於一般的.net事件,而不是他們如何使用asp.net – codymanix 2010-03-09 15:34:14

+0

你實際上是完全正確的。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedindexchanged.aspx (用一點googleing可以做些什麼)。我忘記了Asp.net的標記語言(換句話說,HTML),他們在所有內容前加上了「On」。所以它也被稱爲OnClick ...我的錯誤。雖然它聽起來很奇怪,但它被解僱了兩次。對不起,幫不了你。 – Alxandr 2010-03-09 15:56:51