2009-11-26 3 views
3

J'ai un simple contrôle web (TaskList) qui peut avoir des enfants (tâche) qui héritent de LinkButton, qui peuvent être ajoutés de manière déclarative ou programmée. Cela fonctionne bien, mais je n'arrive pas à déclencher l'événement onclick d'une tâche dans mon code. Le code ..asp.net Contrôle du serveur Web avec contrôles enfants, l'événement ne se déclenche pas

[ToolboxData("<{0}:TaskList runat=\"server\"> </{0}:TaskList>")] 
[ParseChildren(true)] 
[PersistChildren(false)] 
public class TaskList : System.Web.UI.Control 
{ 
    //[DefaultProperty("Text")] 
    public TaskList() 
    {} 

    private List<Task> _taskList = new List<Task>(); 

    private string _taskHeading = ""; 

    public string Heading 
    { 
     get 
     { 
      return this._taskHeading; 
     } 
     set 
     { 
      this._taskHeading = value; 
     } 
    } 

    [NotifyParentProperty(true)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  
    public List<Task> Tasks 
    { 
     get 
     { 
      return this._taskList; 
     } 

     set 
     { 
      this._taskList = value; 
     } 
    } 


    protected override void CreateChildControls() 
    { 
     foreach (Task task in this._taskList) 
      this.Controls.Add(task); 

     base.CreateChildControls(); 
    } 


    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<h2>" + this._taskHeading + "</h2>"); 
     writer.Write("<div class='tasks_container'>"); 
     writer.Write("<div class='tasks_list'>"); 
     writer.Write("<ul>"); 
     foreach (Task task in this._taskList) 
     { 
       writer.Write("<li>"); 
       task.RenderControl(writer); 
       writer.Write("</li>"); 
     } 
     writer.Write("</ul>"); 
     writer.Write("</div>"); 
     writer.Write("</div>"); 
    } 
} 

public class Task : LinkButton 
{ 
    private string _key = ""; 

    public string Key 
    { 
     get 
     { 
      return this._key; 
     } 
     set 
     { 
      this._key = value; 
     } 
    } 

} 

Markup:

<rf:TaskList runat="server" ID="tskList" Heading="Tasks"> 
    <Tasks> 
     <rf:Task Key="ba" ID="L1" Text="Helllo" OnClick="task1_Click" runat="server" /> 
    </Tasks> 
</rf:TaskList> 

L'événement onclick task1_Click ne se déclenche lorsque vous cliquez dessus (bien qu'un postback se produit). TaskList nécessaire pour implémenter INamingContainer pour router correctement les événements de chaque tâche.

Répondre

8

+0

Je suis un peu en retard pour poster une réponse. Encore un vote pour votre savoir. :) – Saar

+0

À la vôtre, j'essaie de maintenir la TaskList à travers les publications, savez-vous comment j'obtiens l'objet et ses enfants dans viewstate? – bleeeah

0

Avez-vous pensé à INamingContainer.

2

Vous pouvez également hériter de CompositeControl, qui implémente INamingContainer pour vous, au lieu d'hériter de Control.