22. juni 2004 - 16:13Der 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 ?
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 ?
/// <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); }
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 ;
Beklager ventetiden - jeg har ikke haft mulighed for at komme online.
Synes godt om
Ny brugerNybegynder
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.