web-dev-qa-db-fra.com

Sur 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

59
Muhammad Akhtar

Je constate qu’il existe déjà de très bons conseils et méthodes suggérés sur la manière d’obtenir le contrôle de retour. 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 vais l'afficher ici avec une petite modification, notamment pour 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 IButtonControl)) continue;

            control = foundControl;
            break;
        }
    }

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

Mise à jour (2016-07-22): La vérification de type pour Button et ImageButton a été modifiée pour rechercher IButtonControl pour permettre la reconnaissance des publications de contrôles tiers.

115
J Pollack

Voici un code qui pourrait faire l'affaire pour vous (tiré de 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;
}
16
silvo

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 post-retour en utilisant le code ci-dessus.

10
Jaroslav Jandek

Si vous devez vérifier quel contrôle est à l'origine de la publication, vous pouvez simplement comparer directement ["__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 de toute méthode d'extension GetPostBackControl(...). 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.

9
tyriker
if (Request.Params["__EVENTTARGET"] != null)
{
  if (Request.Params["__EVENTTARGET"].ToString().Contains("myControlID"))
  {
    DoWhateverYouWant();
  }
}
4
Eduardo

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)

3
DOK

Un ajout aux réponses précédentes, à utiliser Request.Params["__EVENTTARGET"] vous devez définir l’option suivante:

buttonName.UseSubmitBehavior = false;
2
djmcghin

Pour obtenir le nom exact du contrôle, utilisez:

    string controlName = Page.FindControl(Page.Request.Params["__EVENTTARGET"]).ID;
1
Nuno Ribeiro