Pat*_*ick 8 c# events composite web-controls composite-controls
我一直在网上浏览并找到一些关于这个主题的文章,但我仍然无法弄清楚它们之间的区别.我有下面的代码显示,如果我从CompositeControl继承它完美的工作但不是如果我从WebControl继承.(它们都呈现代码,但只有CompositeControl处理事件)
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestLibrary
{
public class TemplateControl : CompositeControl
{
TextBox txtName = new TextBox();
TextBox txtEmail = new TextBox();
Button btnSend = new Button();
private void SetValues()
{
btnSend.Text = "Skicka";
}
protected override void CreateChildControls()
{
SetValues();
this.Controls.Add(new LiteralControl("Namn: "));
this.Controls.Add(txtName);
this.Controls.Add(new LiteralControl("<br />"));
this.Controls.Add(new LiteralControl("Email: "));
this.Controls.Add(txtEmail);
this.Controls.Add(new LiteralControl("<br />"));
btnSend.Command += new CommandEventHandler(btnSend_Command);
this.Controls.Add(btnSend);
}
void btnSend_Command(object sender, CommandEventArgs e)
{
this.Page.Response.Write("Du har nu klickat på skicka-knappen! <br /><br />");
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我单击按钮并将控件呈现为WebControl时,没有任何反应.但是,如果我将WebControl更改为CompositeControl,则会打印出文本.为什么?什么是WebControl和CompositeControl之间的区别?
Jef*_*nal 16
CompositeControls实施,INamingContainer而WebControls不是.
两者之间存在更多差异,但这就是复合控件可以将事件路由到其子节点但是Web控件不能的原因.您可以通过将类声明更改为:
public class TemplateControl : WebControl, INamingContainer
Run Code Online (Sandbox Code Playgroud)
瞧,您的按钮事件现在将被处理!
INamingContainer它只是一个标记接口,它告诉ASP.NET一个控件包含可能需要独立于其父控件访问的子控件,因此子控件可以获得ASP.NET开发人员已经了解和喜爱的那些额外的漂亮ID(例如ctl00$ctl00).
如果WebControl未实现INamingContainer,则不保证子节点的id是唯一的,因此父节点无法可靠地识别它并且无法转发它的事件.
| 归档时间: |
|
| 查看次数: |
4261 次 |
| 最近记录: |