zoukankan      html  css  js  c++  java
  • 【转】【Asp.Net】ASP.NET中自定义控件无法响应事件

    在自定义服务器控件中增加事件处理程序,但代码运行时没有错误,按钮点击下去却没有反应。应该如何处理呢?(本例中,该自定义控件包括一个Button,和一个Label,我希望用户点击了这个Button后,改变Label的Text属性)

    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    namespace WebApplication1
    {
     /// <summary>
     /// Class1 的摘要说明。
    /// </summary>
     public class myControl:Control
     {
      Button bt;
      Label lb; 
    
      protected override void Render(HtmlTextWriter writer)
      {
         bt.RenderControl(writer);
         lb.RenderControl(writer);
      } 
    
      protected override void CreateChildControls()
      {  
        bt
    =new Button();   Controls.Add(bt);     lb=new Label();   Controls.Add(lb);     bt.Click+=new EventHandler(bt_Click);     base.CreateChildControls (); }  private void bt_Click(object sender, EventArgs e) {   this.lb.Text=DateTime.Now.ToString(); } } }

    解决方案添加INamingContainer接口。

    INameContainer是一个空接口,所以您不需要实现它的任何接口方法。

    例如:

    public class myControl:Control,INamingContainer

    {.....}

    原因是这样的

    INameContainer的作用是为myControl中的每一个控件自动指定ID。

    同时它也会改变Asp.net接受到event后的处理流程。

    如果您的控件中没有加入INamingContainer

    ASP.NET page execution cycle

    LoadPostData->OnLoad->RaisePostDataChanged->Handle events->OnPrerender->CreateChildControls->SaveViewState->Render->Dispose

    * CreateChildControls 在 Handle events 之后被调用,此时button还没有被包含在页面中,所以handle event无法触发button_click事件,直接被丢弃。

    加入INamingContainer后

    ASP.NET page execution cycle

    OnInit-> LoadViewState->LoadPostData->RaisePostDataChanged->CreateChildControls->OnLoad->Handle events->OnPrerender->SaveViewState->Render->Dispose

    * Handle events 在 CreateChildControls 后执行。所以能够正确触发button_click事件。

    原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/08/17/1269700.html

  • 相关阅读:
    052-90
    052-89
    052-88
    052-87
    052-86
    html5的manifest
    js中数字转金钱格式
    CSS复合样式
    资料
    异步
  • 原文地址:https://www.cnblogs.com/mqxs/p/3730550.html
Copyright © 2011-2022 走看看