我有一个想要创建的控件。这是我要完成的一个简单例子。
我希望控件包含一个按钮。
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>"));
}
}
}
所以从评论中我试过这个。最简单的例子,仍然没有去。有什么东西我从根本上缺失了吗?
答案 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)
这可能是在事件引发后很好地分配处理程序的情况。
处理控件时我的常见做法是:
答案 5 :(得分:0)
在回发之前和回发之后检查按钮控件的标识符。如果它不相同,它将无法工作。
如果需要,您可以自己覆盖标识符。