Asp.NET服务器控件回发

时间:2009-07-06 19:59:36

标签: c# asp.net events user-controls postback

我有一个想要创建的控件。这是我要完成的一个简单例子。

我希望控件包含一个按钮。

Button b = new Button();
b.Text = "Test";
b.Click += new EventHandler(b_Click);

this.Controls.Add(b);

现在,控件呈现正常,按钮显示在页面上。我遇到的问题的核心是b_Click事件处理程序永远不会被触发。

protected void b_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

这里的任何帮助将不胜感激。我不想在这里使用用户控件纯粹出于自私的原因,并希望将其完全封装在一个DLL中。

提前致谢。

编辑**

namespace ClassLibrary1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class WebCustomControl1 : WebControl
    {

        protected override void CreateChildControls()
        {
            Button b = new Button();
                    b.ID = "button";
            b.Text = "Click Me";
            b.Click += new EventHandler(b_Click);

            this.Controls.Add(b);

            base.CreateChildControls();
        }

        protected void b_Click(object sender, EventArgs e)
        {
            this.Controls.Add(new LiteralControl("<p>Click!</p>"));
        }

    }
}

所以从评论中我试过这个。最简单的例子,仍然没有去。有什么东西我从根本上缺失了吗?

6 个答案:

答案 0 :(得分:6)

public class WebCustomControl1 : WebControl

需要

public class WebCustomControl1 : WebControl, INamingContainer

就是这样。这就是使这个回发问题发挥作用所需的一切。

答案 1 :(得分:3)

覆盖CreateChildControls方法并在该方法中创建/添加按钮(并注册处理程序)。

使用OnInit / OnLoad创建这样的控件是不正确的,会导致行为不一致(例如您遇到的情况)。

编辑:您也可以尝试设置button.ID,以便在每次回发时都是相同的,由于这个原因,引发的事件可能没有看到它。

答案 2 :(得分:2)

请显示您的控件类的定义。

您的控件是否继承自Control,WebControl或CompositeControl。尝试继承CompositeControl并查看是否有帮助。

答案 3 :(得分:1)

因此,您的按钮正确呈现到页面并在用户单击时导致回发,但OnClick代码永远不会运行?

请记住,无论何时进行回发,您都要使用页面类的全新实例。回发过程的一部分正在运行用户触发的任何事件。为此,asp.net处理器需要了解页面生命周期中特定点的事件。 此时,您的按钮必须已经在已注册事件处理程序的页面上。如果没有发生这种情况,您的活动将不会触发。尝试在页面生命周期的早期移动按钮创建。

答案 4 :(得分:0)

这可能是在事件引发后很好地分配处理程序的情况。

处理控件时我的常见做法是:

  1. 使用Control.Init事件初始化所有内容(默认文本,处理程序,大小,组合等),并初始化子控件。
  2. 使用Control.Load事件处理任何数据绑定操作(基于Init事件期间设置的属性/字段)。

答案 5 :(得分:0)

在回发之前和回发之后检查按钮控件的标识符。如果它不相同,它将无法工作。

如果需要,您可以自己覆盖标识符。