60 votes

À la publication, comment puis-je vérifier quel contrôle cause la publication dans l'événement Page_Init

Sur publication, comment puis-je vérifier quel contrôle cause la publication dans l'événement Page_Init.

 protected void Page_Init(object sender, EventArgs e)
{
//need to check here which control cause postback?

}
 

Merci

116voto

J Pollack Points 1067

Je vois déjà de très bons conseils et méthodes pour obtenir le contrôle de retour. Mais aucun message n'est marqué comme une "réponse". Cependant, j'ai trouvé une autre page Web ( blog Mahesh ) avec une méthode permettant de récupérer un ID de contrôle post-back.

Je voudrais le poster ici, tout comme avec une petite modification et en faire une classe d'extension. J'espère que c'est plus utile de cette façon.

 /// <summary>
/// Gets the ID of the post back control.
/// 
/// See: http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
/// </summary>
/// <param name = "page">The page.</param>
/// <returns></returns>
public static string GetPostBackControlId(this Page page)
{
    if (!page.IsPostBack)
        return string.Empty;

    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 controlName = page.Request.Params["__EVENTTARGET"];
    if (!String.IsNullOrEmpty(controlName))
    {
        control = page.FindControl(controlName);
    }
    else
    {
        // if __EVENTTARGET is null, the control is a button type and we need to
        // iterate over the form collection to find it

        // ReSharper disable TooWideLocalVariableScope
        string controlId;
        Control foundControl;
        // ReSharper restore TooWideLocalVariableScope

        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"))
            {
                controlId = ctl.Substring(0, ctl.Length - 2);
                foundControl = page.FindControl(controlId);
            }
            else
            {
                foundControl = page.FindControl(ctl);
            }

            if (!(foundControl is Button || foundControl is ImageButton)) continue;

            control = foundControl;
            break;
        }
    }

    return control == null ? String.Empty : control.ID;
}
 

16voto

silvo Points 2970

Voici un code qui pourrait faire l'affaire pour vous (tiré du blog de Ryan Farley )

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

10voto

Jaroslav Jandek Points 5500

Soit directement dans les paramètres de formulaire, soit

 string controlName = this.Request.Params.Get("__EVENTTARGET");
 

Edit : Pour vérifier si un contrôle a provoqué une publication (manuellement):

 // input Image with name="imageName"
if (this.Request["imageName"+".x"] != null) ...;//caused postBack

// Other input with name="name"
if (this.Request["name"] != null) ...;//caused postBack
 

Vous pouvez également parcourir tous les contrôles et vérifier si l’un d’eux a provoqué un postback en utilisant le code ci-dessus.

10voto

tyriker Points 528

Si vous devez vérifier quel contrôle est à l'origine de la publication, vous pouvez simplement comparer ["__EVENTTARGET"] au contrôle qui vous intéresse:

 if (specialControl.UniqueID == Page.Request.Params["__EVENTTARGET"])
{
    /*do special stuff*/
}
 

Cela suppose que vous allez de toute façon comparer le résultat d'une méthode d'extension GetPostBackControl(...) toute façon. Il peut ne pas gérer CHAQUE situation, mais si cela fonctionne, c'est plus simple. De plus, vous ne parcourrez pas la page à la recherche d'un contrôle qui vous importait au début.

3voto

DOK Points 21175

En supposant qu'il s'agisse d'un contrôle serveur, vous pouvez utiliser Request["ButtonName"]

Pour voir si un bouton spécifique a été cliqué: if (Request["ButtonName"] != null)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X