Avatar billede driis Nybegynder
05. september 2004 - 13:03 Der 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.
Avatar billede snepnet Nybegynder
05. september 2004 - 14:05 #1
problemet ligger formegentlig i den måde du loader kontrollen... må jeg se koden til det ?
Avatar billede driis Nybegynder
05. september 2004 - 16:23 #2
Ja :

        /// <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);
            }
        }
Avatar billede driis Nybegynder
05. september 2004 - 16:25 #3
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.
Avatar billede snepnet Nybegynder
05. september 2004 - 16:35 #4
er du sikker på, at denne metode bliver kørt når du klikker på knappen i din usercontrol :
protected void LoadControl(string control)
Avatar billede snepnet Nybegynder
05. september 2004 - 16:36 #5
(kontrollen bliver ikke automatisk "hængende" når du tilføjer den dynamisk)
Avatar billede driis Nybegynder
05. september 2004 - 19:03 #6
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å ?
Avatar billede snepnet Nybegynder
05. september 2004 - 21:34 #7
svar her :o)

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).

mvh
Avatar billede driis Nybegynder
05. september 2004 - 23:16 #8
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 ;-)
Avatar billede snepnet Nybegynder
06. september 2004 - 00:20 #9
ok :o) - du råber bare op når det er.
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester