5 Stimmen

Wie identifiziert man das Postback-Ereignis in Page_Load

Wir haben einen Legacy-Code, der im Page_Load erkennen muss, welches Ereignis den Postback ausgelöst hat. Im Moment wird dies durch die Überprüfung der Request-Daten wie folgt implementiert...

if (Request.Form["__EVENTTARGET"] != null
&& (Request.Form["__EVENTTARGET"].IndexOf("BaseGrid") > -1 // BaseGrid-Ereignis (z. B. Sortierung)
       || Request.Form["btnSave"] != null // Schaltfläche "Speichern

Das ist ziemlich hässlich und geht kaputt, wenn jemand ein Steuerelement umbenennt. Gibt es eine bessere Möglichkeit, dies zu tun?

Jede Seite so umzuschreiben, dass sie dies nicht in Page_Load überprüfen muss, ist im Moment keine Option.

7voto

Espo Punkte 40386

Damit sollten Sie das Steuerelement erhalten, das den Postback verursacht hat:

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

Lesen Sie mehr darüber auf dieser Seite: http://ryanfarley.com/blog/archive/2005/03/11/1886.aspx

0 Stimmen

Wird dies auch verschachtelte Kontrollen erhalten? Page.FindControl (wenn ich mich richtig erinnere) sucht nicht rekursiv...

0 Stimmen

Es findet keine Steuerelemente innerhalb eines Steuerelements vom Typ Listenansicht, nein.

0voto

AProgrammer Punkte 148

Wenn das Steuerelement vom Typ ImageButton ist, fügen Sie zusätzlich zum obigen Code den folgenden Code hinzu,

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

0voto

AProgrammer Punkte 148

Ich bin nur die Entsendung der gesamten Code (die das Bild Schaltfläche / zusätzliche Kontrolle, die postback Ursachen umfasst). Danke 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; 
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X