3

LinkBut​​ton から継承する子 (Task) を持つことができる単純な Web コントロール (TaskList) があり、宣言的またはプログラム的に追加できます。これは問題なく動作しますが、コード ビハインドでタスクの onclick イベントを発生させることができません。コード ..

    [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;
        }
    }

}

マークアップ:

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

Onclick イベント task1_Click がクリックされても発生しません (ポストバックは発生します)。

4

3 に答える 3

8

各タスクのイベントを正しくルーティングするには、TaskList に INamingContainer を実装する必要がありました。

于 2009-11-26T11:43:43.280 に答える
2

Controlから継承する代わりに、INamingContainerを実装するCompositeControlから継承することもできます。

于 2010-03-30T19:20:12.483 に答える
0

INamingContainer について考えたことはありますか。

于 2009-11-26T11:44:52.537 に答える