05. september 2004 - 13:03Der er
8 kommentarer og 1 løsning
Problem med events i UserControl
På min UserControl, som loades dynamisk, har jeg en linkbutton: <asp:LinkButton id="btnAddNew" runat="server" OnCommand="AdminNavigate" CausesValidation="False" CommandName="new">LinkButton</asp:Button>
I koden er "AdminNavigate" defineret således: protected void AdminNavigate(object sender, CommandEventArgs e) { Session["admin.action"] = e.CommandArgument.ToString(); DataBind(); }
Jeg overrider ikke OnInit eller lign. Når der klikkes på LinkButton'en, bliver AdminNavigate ikke kørt - hvad gør jeg galt ? Det hjælper ikke, hvis jeg f.eks. skifter min LinkButton ud med en Button.
/// <summary> /// Initializes the content field and loads the appropiate user control /// This must be done in the PreRender event, as eventhandling for the navigation /// button is not done until after the Load event has been handled. /// </summary> /// <param name="e">Event arguments</param> protected override void OnPreRender(System.EventArgs e) { base.OnPreRender(e); // Find out which control to load if ( Page.Session == null ) LoadControl("CustomerView"); else if ( Page.Session["content"] == null ) LoadControl("CustomerView"); else LoadControl(Page.Session["content"].ToString()); }
/// <summary> /// Loads a UserControl onto the page. /// </summary> /// <param name="control">Filename of the control</param> protected void LoadControl(string control) { control = "Controls/" + control + ".ascx"; try { this.Controls.Add(Page.LoadControl(control)); } catch(Exception ex) { throw new ApplicationException("Error while loading control: " + control,ex); } }
Forklaring: Den klasse, ovenstående kodestump stammer fra, fungerer som en slags placeholder, der finder ud af hvilken kontrol, der skal loades, og derefter loader den ved hjælp af LoadControl metoden.
LoadControl blev kørt, men jeg har nu opdaget at det var for sent: LoadControl blev kørt i OnPreRender, og eventhandling udføres åbenbart før dette; derfor eksisterer kontrollen ikke under eventhandlingen. Løsningen var at loade kontrollen i OnLoad i stedet for i OnPreRender.
Du må gerne lægge et svar. Kan du i øvrigt fortælle mig hvordan jeg i en UserControl fanger en event, der opstår på den aspx side, som UserControl'en befinder sig på ?
Hvordan du i en usercontrol fanger et event der fyres fra dit page-objekt (jeg går ud fra at du mener et event som f.eks. et tryk på en knap på siden)... Den er lidt mere kringlet, og som du har formuleret spørgsmålet vil jeg svare at det teknisk set godt kan lade sig gøre, men at det bliver noget grisseri... Et eksempel kunne være :
// hvis du opretter en almindelig form vha. VS, kunne du ende med sådan en her :
public class SomePage : Page { // du kunne så sørge for at der kunne abboneres på (det skrevne virker ikke alene): public SomeDelegate SomeEvent; }
// og for så vidt abbonere på den fra en usercontrol sådan her :
public SomeUserControl : UserControl { private SomePage somePage;
protected override void OnInit(EventArgs e) { if(this.NamingContainer is SomePage) { somePage = (SomePage)this.NamingContainer; somePage.SomeEvent += new EventHandler(somePage_SomeEvent); } }
private void somePage_SomeEvent(object sender, EventArgs e) { // gør noget } }
Der er masser af tiltag du kunne gøre - som ville gøre billedet pænere (baser for dine page-klasser eller interfaces), men kan du ikke prøve at skrive hvad det præcis er du har brug for... Så skal jeg se om jeg kan komme med et forslag (der kan være mange måder at komme frem til en funktionalitet som minder om det du spørger om - altså sådan som jeg forstår dit spørgsmål :o).
Skriv meget gerne lidt mere... så skal du få et bud asap (jeg sidder her i hvert fald den næste times tid vil jeg tro).
Jeg når ikke at få mere gjort ved det lige nu; så jeg opretter et spørgsmål en anden dag du kan få lov at hjælpe mig med - idet jeg ikke er helt med på, hvorfor du mener at dit eksempel herover er noget griseri ;-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.