c#如何让覆盖面板在用户控件中工作

时间:2012-02-15 21:16:24

标签: c# asp.net user-controls panel

我正在.Net中创建一个C#Web应用程序

我已重写Panel控件以使​​div可单击。它看起来像这样:

public class ProjectPanel : System.Web.UI.WebControls.Panel, System.Web.UI.IPostBackEventHandler
{
    public ProjectPanel() 
    {
        CssClass = "project";
        this.Click += new EventHandler(ProjectPanel_Click);
    }

    public event EventHandler Click;

    protected virtual void OnClick(EventArgs e)
    {
        if (Click != null)
        {
            Click(this, e);
        }
    }

    public void RaisePostBackEvent(string eventArgument)
    {
        OnClick(new EventArgs());
    }

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        this.Attributes.Add("onclick", "__doPostBack('" + this.ClientID + "', '');");
        base.Render(writer);
    }
    public void ProjectPanel_Click(object sender, EventArgs e)
    {
        Label l = new Label();
        l.Text = " HIYA";
        this.Controls.Add(l);
    }
}

现在,这在页面内工作正常。但是,我还有一个Web用户控件,如下所示:

<div class="team">

<asp:Panel runat="server" ID="TheCanvas" CssClass="projects" />

</div>

现在,当我将覆盖面板添加到TheCanvas面板时,click事件不再被注册。回发发生,但ProjectPanel_Click不会触发。有任何想法吗?我正在通过代码添加面板。

2 个答案:

答案 0 :(得分:1)

您的面板应该在每次回发时创建。回发发生但是服务器端不存在您的面板。尝试通过页面加载功能上的代码添加面板。

答案 1 :(得分:0)

您应该使用UniqueID而不是ClientID,因为当在另一个控件中客户端ID以parend客户端ID作为前缀时,请将onclick属性设置替换为:

this.Attributes.Add("onclick", "__doPostBack('" + this.UniqueID + "', '');");

顺便说一句。你应该知道,如果你没有在页面上有另一个实现IPostBackDataHandler的控件,__ doPostback javascript就不会出现,你会得到javascript错误:

  

__ doPostBack未定义

你应该在面板控件中实现IPostBackDataHandler并调用Page.RegisterRequiresPostBack(this),详见这个链接:

http://aspalliance.com/1071_Smart_ListControl_in_ASPNET_1x20.4

http://www.timvasil.com/blog14/post/2007/10/30/Implementing-IPostBackDataHandler-once-and-for-all.aspx