2008-09-08 4 views
5

Nous avons du code hérité qui doit identifier dans le Page_Load quel événement a provoqué la publication. Au moment cela est mis en œuvre en vérifiant les données de demande comme celui-ci ...Comment faire pour identifier l'événement de publication dans Page_Load

si (Request.Form [ "__ eventtarget"]! = Null
& & (Request.Form [ "__ eventtarget"]. IndexOf ("BaseGrid")> -1 // BaseGrid événement (par exemple type)
              || Request.Form [ "btnSave"]! = null // bouton Enregistrer

C'est assez laid et casse si quelqu'un renomme un contrôle. g ceci?

Réécrire chaque page de manière à ne pas avoir à vérifier cela dans Page_Load n'est pas une option pour le moment.

Répondre

6

Cela devrait vous obtenir le contrôle qui a provoqué la postback:

public static Control GetPostBackControl(Page page) 
{ 
    Control control = null; 

    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if (ctrlname != null && ctrlname != string.Empty) 
    { 
     control = page.FindControl(ctrlname); 
    } 
    else 
    { 
     foreach (string ctl in page.Request.Form) 
     { 
      Control c = page.FindControl(ctl); 
      if (c is System.Web.UI.WebControls.Button) 
      { 
       control = c; 
       break; 
      } 
     } 
    } 
    return control; 
} 

En savoir plus à ce sujet sur cette page: http://ryanfarley.com/blog/archive/2005/03/11/1886.aspx

+0

Est-ce que cela aura aussi des contrôles imbriqués? Page.FindControl (si je me souviens bien) ne recherche pas récursivement ... –

+0

Il ne trouvera pas de contrôles dans un contrôle de type listview, non. – Espo

0

En plus du code ci-dessus, si le contrôle est de type ImageButton alors ajouter le code ci-dessous,

if (control == null) 
{ for (int i = 0; i < page.Request.Form.Count; i++) 
    { 
     if ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))) 
      { control = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2)); break; 
      } 
    } 
} 
0

Je viens de poster le code entier (qui comprend le bouton d'image/contrôle de contrôle supplémentaire qui cause s postback). Merci Espo.

public Control GetPostBackControl(Page page) 
{ 
    Control control = null; 
    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if ((ctrlname != null) & ctrlname != string.Empty) 
     { 
     control = page.FindControl(ctrlname); 
     } 
    else 
     { 
     foreach (string ctl in page.Request.Form) 
      { 
       Control c = page.FindControl(ctl); 
       if (c is System.Web.UI.WebControls.Button) 
        { control = c; break; } 
      } 
     } 
// handle the ImageButton postbacks 
if (control == null) 
{ for (int i = 0; i < page.Request.Form.Count; i++) 
    { 
     if ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))) 
      { control = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2)); break; 
      } 
    } 
} 
return control; 
} 
Questions connexes