Avatar billede driis Nybegynder
22. juni 2004 - 16:13 Der er 15 kommentarer og
1 løsning

Problem med eventhandler

Jeg har en række LinkButtons som oprettes dynamisk, og hvor jeg gerne vil have kaldt den samme eventhandler uanset hvilken, der klikkes på. Linkbuttons tilføjes i denne løkke:

foreach(DirectoryInfo d in dirs)
{
    htr = new HtmlTableRow();
    htc = new HtmlTableCell();
    lb = new LinkButton();
    lb.Text = d.Name;
    lb.ID = d.FullName;
    lb.Click += new EventHandler(lb_Click);
    htc.Controls.Add(lb);
    htr.Controls.Add(htc);
    ht.Controls.Add(htr);
}

og eventhandleren ser således ud (indtil videre):
private void lb_Click(object sender, EventArgs e)
{
    Response.Output.Write("lb_Click");

    update();
}

lb_Click kaldes tilsyneladende ikke når man klikker på knapperne. Hvad gør jeg galt ?
Avatar billede burningice Nybegynder
22. juni 2004 - 17:02 #1
brug eventrelay
Avatar billede driis Nybegynder
22. juni 2004 - 17:03 #2
Kan du forklare nærmere ?
Avatar billede burningice Nybegynder
22. juni 2004 - 17:11 #3
Avatar billede driis Nybegynder
22. juni 2004 - 18:53 #4
Dit link hjælper mig ikke rigtigt.

Det jeg vil, er at lb_Click skal kaldes hver gang en LinkButton klikkes.

Jeg mener at en konstruktion, som den jeg har lavet, bør virke. Hvad gør jeg galt ?
Avatar billede burningice Nybegynder
22. juni 2004 - 19:10 #5
du skal lave en EventRelay som sørger for at kalde din lb_Click. Problemet er at dine linkbuttons ikke bliver oprettet igen ved postback
Avatar billede burningice Nybegynder
22. juni 2004 - 19:12 #6
Selve eventrelayen er meget simpel. Kan f.eks. se sådan her ud

public class EventRelay : System.Web.UI.Control
  , System.Web.UI.IPostBackEventHandler
{
  public void RaisePostBackEvent(System.String EventArgument)
  {
    OnRaised(EventArgument);
  }
}
 
public event RaisedEventHandler Raised;
public void OnRaised(System.String Argument)
{
  if(Raised != null)
    Raised(Argument);
Avatar billede driis Nybegynder
22. juni 2004 - 19:28 #7
Mine buttons skulle da meget gerne blive oprettet ved hvert postback - idet ovenstående kode kaldes i OnInit.
Avatar billede snepnet Nybegynder
27. juni 2004 - 19:47 #8
Konstruktionen burde fungere når det køres fra OnInit - er du helt sikker på at handleren ikke kaldes ?
Jeg mener - er det pr. debug at du udleder det, eller er det fordi du ikke får din Response.Output.Write (som du kan forkorte til Response.Write) ud på skærmen ?

Er knapperne synlige efter du har klikket på en af dem ?
Avatar billede driis Nybegynder
27. juni 2004 - 20:59 #9
Ja knapperne er synlige efter klik. Og det er med debuggeren jeg konstaterer, at eventhandleren ikke kaldes.
Avatar billede snepnet Nybegynder
27. juni 2004 - 22:58 #10
Det er lidt sært - jeg kan ikke fremprovokere problemet her. Kan du sende lidt mere af koden ?
Avatar billede driis Nybegynder
27. juni 2004 - 23:06 #11
Dette er hele klassen som den ser ud pt.
Håber du kan finde fejlen :-)

public class FileList : UserControl
{
    /// <summary>
    /// Holds the current directory path
    /// </summary>
    protected string directory = null;

    /// <summary>
    /// Holds the root directory path
    /// </summary>
    protected string rootDirectory = null;

    protected CommandEventHandler eh;

    /// <summary>
    /// Constructor
    /// </summary>
    public FileList()
    {   
    }

    /// <summary>
    /// Does basic initialization and makes sure update() is called during init.
    /// </summary>
    /// <param name="e">Event arguments</param>
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        rootDirectory = Attributes["RootDirectory"];

        update();
    }

    /// <summary>
    /// Updates the control display
    /// </summary>
    protected void update()
    {
        if ( rootDirectory == null )
            throw new Exception("FileList: Not properly initialized while loading page:" +
                this.Page.ToString());

        if ( directory == null )
            directory = rootDirectory;

        HtmlTable ht = new HtmlTable();
        HtmlTableRow htr = new HtmlTableRow();
        HtmlTableCell htc = new HtmlTableCell();
        htc.Controls.Add(new LiteralControl("Contents of: <b>" + directory + "</b>"));
        htr.Controls.Add(htc);
        ht.Controls.Add(htr);

        DirectoryInfo di = new DirectoryInfo(directory);
        DirectoryInfo [] dirs = di.GetDirectories();
        FileInfo [] files = di.GetFiles();
        LinkButton lb;
        //eh = new CommandEventHandler(lb_Click);
        foreach(DirectoryInfo d in dirs)
        {
            htr = new HtmlTableRow();
            htc = new HtmlTableCell();
            lb = new LinkButton();
            lb.Text = d.Name;
            lb.ID = d.FullName;
        //    lb.Command += eh;
            lb.Click += new EventHandler(lb_Click);
            htc.Controls.Add(lb);
            htr.Controls.Add(htc);
            ht.Controls.Add(htr);
        }

        Controls.Add(ht);
   
    }

   

    protected void lb_Click(object sender, EventArgs e)
    {
        if ( sender is LinkButton )
        {
            LinkButton src = (LinkButton)sender;
            directory = src.ID;
        }
        else Response.Output.WriteLine(sender.ToString());
    }

}
Avatar billede snepnet Nybegynder
28. juni 2004 - 01:22 #12
Ah... Det tror jeg godt jeg kan. Du angiver ID's på knapperne til nogle path-værdier. Det medfører sikkert nogle ulovlige ID's med "\" og den slags i.
Fjern denne linie (så autogenereres der lovlige ID's til dig):
lb.ID = d.FullName;
Og angiv d.FullName på lb.CommandArgument istedet, som du så samler op i handleren ved :
directory = src.CommandArgument ;
Avatar billede driis Nybegynder
28. juni 2004 - 17:20 #13
Bingo, så fungerer det. Mange tak for hjælpen. Du må godt lægge et svar.
Avatar billede driis Nybegynder
29. juni 2004 - 18:39 #14
snepnet>> Som sagt må du gerne lægge et svar, så jeg kan lukke spørgsmålet.
Avatar billede snepnet Nybegynder
30. juni 2004 - 11:56 #15
Svar :o)
Avatar billede snepnet Nybegynder
30. juni 2004 - 12:16 #16
Beklager ventetiden - jeg har ikke haft mulighed for at komme online.
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