2010-06-07 80 views
1

我正在创建一个Web服务器控件,它上面有一个图像按钮。 控件的html在代码的RenderControls中完成,控件从WebControl,IScriptControl,INamingContainer发出。Web服务器控件中的控件事件

按钮被编码为遵循RenderControls:

System.Web.UI.WebControls.ImageButton img = new System.Web.UI.WebControls.ImageButton(); 
img.ImageUrl = "Url of the image"; 
img.Click += new ImageClickEventHandler(img_Click); 
img.ID = this.ClientID + "_img"; 
img.CausesValidation = false; 
imgLock.RenderControl(output); 

在浏览器中的按钮apreas但是当我点击它,页面postsback但该按钮的事件处理程序不被解雇,从我可以看出,因为每次页面被重新发布时,控件都会经历RenderControls,按钮被重绘,事件处理消失。

此服务器控件位于母版页中。

任何人都可以帮助我吗?

感谢

回答

1

当你回发在asp.net数据,将遵循不同的阶段:

1.Initialization, 2.LoadViewState 3.LoadPostData 4.ObjectLoad

在阶段3(的LoadPostData)的框架将在每个提交数据的控件上实现IPostBackDataHandler接口。

页面然后触发LoadPostData事件并将匹配每个实现此接口的控件与正确的回发数据。

这意味着您需要在Asp.net到达阶段(LoadPostData)之前创建控件。

我的建议是在Page_Init上创建控件,这样你就不会丢失事件。 (点击进入)。

+0

由于该按钮位于添加到母版页的Web服务器控件中,因此我将如何使用page_init? – MarkyMarc 2010-06-07 19:34:58

+0

其实经过多一点研究后,我改变了我的服务器控件,将其子控件创建为OnInit事件,现在它可以工作。 非常感谢让我走上正轨 – MarkyMarc 2010-06-09 11:59:31

+0

@MarkyMarc我有同样的问题。你究竟做了什么?您可以发布+1的完整解决方案吗?谢谢! – Rushino 2012-02-16 21:01:57

1

的WebControl必须创建和页面加载事件发生后已附加事件处理程序来处理来自用户的任何输入。
您应该尝试创建ImageButton,设置事件处理程序并将其添加到重写方法OnLoad中的Controls集合中。

protected override void OnLoad(EventArgs e) 
{ 
    System.Web.UI.WebControls.ImageButton img = new System.Web.UI.WebControls.ImageButton(); 
    img.ImageUrl = "Url of the image"; 
    img.Click += new ImageClickEventHandler(img_Click); 
    img.ID = this.ClientID + "_img"; 
    img.CausesValidation = false; 
    this.Controls.Add(img); 
} 
+0

感谢您的建议。我试过这个,我得到了同样的结果。 – MarkyMarc 2010-06-07 19:44:43

1

难道是你的Button的ID在回传之间改变了吗?

img.ID = this.ClientID 

......看起来很奇怪。将它替换为img.ID =“MyButtonID”或类似的东西。

+0

我尝试了一个按钮的静态名称,结果相同。 – MarkyMarc 2010-06-07 19:37:14