views:

201

answers:

3

what is the difference between

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

and

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

?

And is the attribute AutoPostBack="True" always required?

Iam asking because it seems my OnSelectedIndexChanged-event seem always to be called twice (EDIT: When I use SelectedIndexChanged, the handler isn't called at all).

Why could this be?

EDIT: these at the stacktraces I get from the event which is fired twice. The latter seem to be called from some kind of timer. I never created a time, it must be some of the system.

   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    

This is when the event is called the second time:

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] 
+1  A: 

The AutoPostBack property means that selection of the control will cause a post. If it is not set to true, then you will need to do something else to submit the form (i.e. a button click)

The possiblity on OnSelectedIndexChanged event, is check to make sure that you don't have it adding the event handler twice. If you have it defined in the ASPX, then do not have it being added on the codebehind and vice versa.

Stephen Wrighton
yes iam sure that I added is only in my aspx file
codymanix
I've had this happen to me a few times before. Be sure not to set in ASPX and Codebehind otherwise it can possibly screw up the page... and try to call it twice. You really only need one or the other (I prefer the code behind).
Rob
I edited my question. I found that some kind of timercallback is causing this, but it isn't from me.
codymanix
A: 

If I recall correctly the events that's named OnSomething are more for internal use (like if you create a child-class you'd override the OnSelectedIndexChanged). So I think it's good practice to use the SelectedIndexChange.

As for the AutoPostBack, this is to make shure that the page posts back to the server when an item is changed. If this is not set to true then you (the server) will never now that it changed before the user clicks some submit-button or does something else that causes and autopostback (on another controll).

EDIT:

One more thing, if I don't recall wrongly a OnSomething method normally is the one that calls the Something event (Edit2, this seems not to be the case with the markup-language in Asp.NET (the html). OnSomething="" in html maps to the Something event it seems, my bad). So if you'd write a class "Person" with a name that could be changed you'd do it like this:

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;
}

or something like that.

Microsofts example's probably better than mine though :-P: http://msdn.microsoft.com/en-us/library/5z57dxz2.aspx

Alxandr
I tried it without "On", just with SelectedIndexChanged but then the handler isn't called at all. Also the page you are giving is about .net events in general and not how they work with asp.net
codymanix
You're quite right actually. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedindexchanged.aspx(what one can do with a little googleing). I forgot that in the markup-language for Asp.net (the html in other words) they've added "On" in front of everything. So it's also called OnClick... My mistake. Though it still sounds strange that it's fired twice.. Sorry, can't help you there.
Alxandr
+3  A: 

what is the difference between [asp:DropDownList 1] and [asp:DropDownList 2]?

SelectedIndexChanged is not a valid attribute for an asp:DropDownList tag, so ASP.NET won't do anything with it.

I am asking because it seems my OnSelectedIndexChanged-event seem always to be called twice ... Why could this be?

Your stack trace suggests that the second event invocation is caused by a re-entrant thread. Are you running any asynchronous delegates from your page, using client callbacks, or using a third-party control?

Jeff Sternal
Iam using the microsoft ajax library. I don't know how I could possible accidently have included asynchronous delegates or client callbacks without knowing it.
codymanix
Thank, now I found it because you brought me on the right track. Iam using a AJAX ListSearchExtender which is causing the problem. The Question now is how to fix that..
codymanix
Hooray! Are you sure there's anything you need to fix? The `ListSearchExtender` changes the drop-down selection: isn't it appropriate to call `OnSelectedIndexChanged` when it does that?
Jeff Sternal
But I don't need the event handler called twice, this is just causing unnecessary traffic.
codymanix