2011-09-01 18 views
26

Ho due pulsanti:Quale controllo ha causato il postback?

<asp:Button ID="Button1" runat="server" Text="Button" /> 
<asp:Button ID="Button2" runat="server" Text="Button" /> 

Come è possibile determinare il Pageload che uno di questo due ha causato il postback? C'è una soluzione breve perché so che ci sono solo due controlli che possono causare questo postback?

+3

http://aspnetnova.blogspot.com/2009/04/find-post-back-co ntrol-in-aspnet-page-c.html –

risposta

43

È possibile utilizzare questo metodo per ottenere il controllo che ha causato il postback:

/// <summary> 
/// Retrieves the control that caused the postback. 
/// </summary> 
/// <param name="page"></param> 
/// <returns></returns> 
private Control GetControlThatCausedPostBack(Page page) 
{ 
    //initialize a control and set it to null 
    Control ctrl = null; 

    //get the event target name and find the control 
    string ctrlName = page.Request.Params.Get("__EVENTTARGET"); 
    if (!String.IsNullOrEmpty(ctrlName)) 
     ctrl = page.FindControl(ctrlName); 

    //return the control to the calling method 
    return ctrl; 
} 
+0

Questo non sta trovando il controllo se è all'interno di un ripetitore poiché il nome del controllo è vuoto. Qualche idea su come trovarlo? – djmj

+0

"Pagina" nella prima Page.Richiesta deve essere page.Richiesta – LarryBud

+0

@LarryBud: Buona cattura, grazie. –

11

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

private string getPostBackControlName() 
    { 
     Control control = null; 
     //first we will check the "__EVENTTARGET" because if post back made by  the controls 
     //which used "_doPostBack" function also available in Request.Form collection. 

     string ctrlname = Page.Request.Params["__EVENTTARGET"]; 
     if (ctrlname != null && ctrlname != String.Empty) 
     { 
      control = Page.FindControl(ctrlname); 
     } 

     // if __EVENTTARGET is null, the control is a button type and we need to 
     // iterate over the form collection to find it 
     else 
     { 
      string ctrlStr = String.Empty; 
      Control c = null; 
      foreach (string ctl in Page.Request.Form) 
      { 
       //handle ImageButton they having an additional "quasi-property" in their Id which identifies 
       //mouse x and y coordinates 
       if (ctl.EndsWith(".x") || ctl.EndsWith(".y")) 
       { 
        ctrlStr = ctl.Substring(0, ctl.Length - 2); 
        c = Page.FindControl(ctrlStr); 
       } 
       else 
       { 
        c = Page.FindControl(ctl); 
       } 
       if (c is System.Web.UI.WebControls.Button || 
         c is System.Web.UI.WebControls.ImageButton) 
       { 
        control = c; 
        break; 
       } 
      } 

     } 
     return control.ID; 
    } 
+0

[Questa versione] (http://stackoverflow.com/a/3509755/2415524) è aggiornata il 2016-07-22. – mbomb007

0

Questo aiuta a trovare il nome del controllo che ha causato postback in pageload.This mi ha aiutato Speriamo che questo aiuti qualcun altro

<asp:Button ID="Button1" runat="server" Text="Button" 
    OnClientClick = "SetSource(this.id)" /> 

    <asp:ImageButton ID="ImageButton1" runat="server" 
    OnClientClick = "SetSource(this.id)" /> 

      <script type = "text/javascript"> 
      function SetSource(SourceID) 
      { 
    var hidSourceID = 
    document.getElementById("<%=hidSourceID.ClientID%>"); 
    hidSourceID.value = SourceID; 
    } 
    </script> 

on code behind you can get the ID of the function using : 
if (IsPostBack) 
{ 
    string CtrlID = string.Empty; 
    if (Request.Form[hidSourceID.UniqueID] != null && 
     Request.Form[hidSourceID.UniqueID] != string.Empty) 
    { 
    CtrlID = Request.Form[hidSourceID.UniqueID]; 
    } 
} 
Problemi correlati