2009-05-11 4 views
1

Ich habe die Eigenschaft enableviewstate von linkbutton und label auf true gesetzt. Auch die gleichen Buttons beim postback im Pageload Event-Handler wieder aktivieren. Aber ich kann onclick Event-Handler von linkbutton.can nicht aufrufen. Bitte sagen Sie mir, was ist ein Problem mit Code?Asp.net: Event-Handler von dynamisch generierten Schaltflächen aufrufen?

public partial class _Default: System.Web.UI.Page { protected void Page_Load (object sender, EventArgs e) {

 List<LinkButton> listOfLinkButton = Session["ListOfLinkButton"] as List<LinkButton>; 
     List<Label> listOfLabel = Session["ListOfLabel"] as List<Label>; 
     if(listOfLabel!=null && listOfLinkButton!=null) 
     { 
      for (int i = 0; i < listOfLinkButton.Count; i++) 
      { 
       PlaceHolder1.Controls.Add(listOfLinkButton[i]); 
       PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
       PlaceHolder1.Controls.Add(listOfLabel[i]); 
       PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
      } 
     } 



} 



protected void LinkButton_Click(object sender, EventArgs e) 
{ 
    LinkButton linkButton = sender as LinkButton; 

    Response.Redirect(linkButton.Attributes["LinkUrl"]);   
} 
protected void Button1_Click1(object sender, EventArgs e) 
{ 

    List<LinkButton> listOfLinkButton = new List<LinkButton>(); 
    List<Label> listOfLabel = new List<Label>(); 
    Rss rssDocumentObj = RssFileReader.GetRssDocumentData(TextBox1.Text); 
    for (int j = 0; j < rssDocumentObj.ListOfChannel.Count; j++) 
    { 
     LinkButton linkButton = new LinkButton(); 
     linkButton.ID = "LinkButtonForChannelDynamicInPlaceHolder1Id" + j; 
     linkButton.EnableViewState = true; 
     linkButton.ForeColor = Color.Blue; 
     linkButton.Font.Bold = true; 
     linkButton.Font.Size = 18; 
     linkButton.Font.Underline = true; 
     linkButton.Text = rssDocumentObj.ListOfChannel[j].ChannelTitle.InnerText; 
     linkButton.Click += new EventHandler(LinkButton_Click); 
     linkButton.Attributes.Add("LinkUrl", rssDocumentObj.ListOfChannel[j].ChannelLink.InnerText); 
     linkButton.Attributes.Add("onmouseover", "this.style.color = '#006699'"); 
     linkButton.Attributes.Add("onmouseout", "this.style.color = '#0000ff'"); 
     PlaceHolder1.Controls.Add(linkButton); 
     listOfLinkButton.Add(linkButton); 
     PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
     Label label = new Label(); 
     label.ID = "LabelForChannelDynamicInPlaceHolder1Id" + j; 
     label.EnableViewState = true; 
     label.ForeColor = Color.DarkSlateGray; 
     label.Text = rssDocumentObj.ListOfChannel[j].ChannelDescription.InnerText; 
     PlaceHolder1.Controls.Add(label); 
     listOfLabel.Add(label); 
     PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 

     for (int i = 0; i < rssDocumentObj.ListOfChannel[j].ListOfItem.Count; i++) 
     { 
      LinkButton linkButtonForItem = new LinkButton(); 
      linkButtonForItem.ID = "LinkButtonDynamicInPlaceHolder1Id" + j + " " + i; 
      linkButtonForItem.EnableViewState = true; 
      linkButtonForItem.ForeColor = Color.Blue; 
      linkButtonForItem.Font.Bold = true; 
      linkButtonForItem.Font.Size = 14; 
      linkButtonForItem.Font.Underline = false; 
      linkButtonForItem.Text = rssDocumentObj.ListOfChannel[j].ListOfItem[i].ItemTitle.InnerText; 
      linkButtonForItem.Click += new EventHandler(LinkButton_Click); 
      linkButtonForItem.Attributes.Add("LinkUrl", rssDocumentObj.ListOfChannel[j].ListOfItem[i].ItemLink.InnerText); 
      linkButtonForItem.Attributes.Add("onmouseover", "this.style.color = '#006699'"); 
      linkButtonForItem.Attributes.Add("onmouseout", "this.style.color = '#0000ff'"); 
      PlaceHolder1.Controls.Add(linkButtonForItem); 
      listOfLinkButton.Add(linkButtonForItem); 
      PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
      Label labelForItem = new Label(); 
      labelForItem.ID = "LabelDynamicInPlaceHolder1Id" + i; 
      labelForItem.EnableViewState = true; 
      labelForItem.ForeColor = Color.DarkGray; 
      labelForItem.Text = rssDocumentObj.ListOfChannel[j].ListOfItem[i].ItemDescription.InnerText; 
      PlaceHolder1.Controls.Add(labelForItem); 
      listOfLabel.Add(labelForItem); 
      PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
      Session["ListOfLinkButton"] = listOfLinkButton; 
      Session["ListOfLabel"] = listOfLabel; 
     } 
    } 
} 

}

Antwort

1

Sie machen Annahmen über die Aspekte dieser Schaltfläche wird in der Sitzung gespeichert. Versuchen Sie, das Ereignis der Schaltfläche erneut hinzuzufügen, wenn Sie während des Ladens der Seite aus dem Sitzungsstatus wiederherstellen.

0

Ich habe meine Lösung, indem ich den Event-Handler erneut Button nach dem Abrufen aus der Sitzung zuweisen, aber ich konnte nicht verstehen, warum ich es erneut zuweisen muss, wenn es bereits in gespeicherten Sitzungsvariablen zugewiesen ist.

+1

Wenn Sie darüber nachdenken, was es bedeuten würde, den Event-Handler zu serialisieren, indem Sie im Grunde einen Zeiger auf eine Funktion serialisieren, wird klar, dass es wahrscheinlich kein sehr nützliches Feature wäre, IMO. –

Verwandte Themen