aspx:
<form runat=server>
<yourPrefix:YourTagName id="wuc1" runat=server />
...
</form>
code behind:protected DelegateTest.WebUserControl1 wuc1;private void InitializeComponent()
{    
 ...
 wuc1.ButtonClick += new DelegateTest.ButtonClickEventHandler(testmethod);
}

解决方案 »

  1.   

    你还没有设定事件阿所以ButtonClick为null;
    在页面上加上wuc1.ButtonClick += new DelegateTest.ButtonClickEventHandler(testmethod);
    只有加挂了事件ButtonClick得值才不为空。
    另外你的整个web项目必须编译过去才能保证这个事件正确运行。
      

  2.   


    这样是达不到预想效果的。
    1.你的自定义控件要实现IPostBackEventHandler接口。这个很简单
    2.在自定义控件的客户总端代码中,应使用Page.GetPostBackEventReference(this)生成的客户端的代码作为提交的方法参考一下这篇文章
    http://www.up2soho.com/csharp/showart.asp?art_id=80&cat_id=2
      

  3.   

    我按照以上几位高手的说法试了一下,还是不行,也许是我表述的不太好吧,我再把主要的代码贴出来吧,如下:
    ===================================================================
    控件中的主要代码
    ===================================================================
    //web用户控件上有一服务器端控件Button1
    protected System.Web.UI.WebControls.Button Button1;
    //delegate 声明定义一种引用类型
    public delegate void ButtonClickEventHandler(object sender,System.EventArgs e);
    //指定一个事件
    public event ButtonClickEventHandler ButtonClick;
    //指定委托代理
    private void InitializeComponent()
    {
    this.Load += new System.EventHandler(this.Page_Load);
    this.Button1.Click+=new System.EventHandler(testMethod);
    }
    //事件处理
    private void testMethod(object sender,System.EventArgs e)
    {
    if(ButtonClick!=null)
       ButtonClick(sender,e);
    }=============================================================================
    引用上面所定义控件的一个WEB页面
    =============================================================================
    --------------------
    客户端代码:
    --------------------
    <form id="Form1" method="post" runat="server">
    <uc1:WebUserControl1 id="WebUserControl11" runat="server"></uc1:WebUserControl1>
    </form>
    ---------------------------
    服务器端代码:(BehindCode)
    ---------------------------
    //创建一用户控件的实例
    protected DelegateTest.WebUserControl1 wuc1=new WebUserControl1();
    //指定委托代理
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
    wuc1.ButtonClick += new DelegateTest.ButtonClickEventHandler(testmethod);
    }
    //testmethod方法
    private void testmethod(object sender, System.EventArgs e)
    {
    Response.Write("<script>alert('OK');</script>");
    }=================================================================================
    运行---
    点击WEB页面上的用户控件wuc1的子控件(Button1),并不能触发testmethod方法,我跟了一下代码,结果表明:
    用户控件的以下代码
    private void testMethod(object sender,System.EventArgs e)
    {
    if(ButtonClick!=null)
       ButtonClick(sender,e);
    }
    中的ButtonClick的值为null
    =================================================================================
    这是什么原因呀,还请各位大哥不吝赐教,小弟在这儿谢啦!
      

  4.   

    这样试试
    1:public delegate void ButtonClickEventHandler(object sender,System.EventArgs e);
    //指定一个事件
    private event ButtonClickEventHandler _ButtonClick;
    /// <summary>
    /// 定义要暴露的ButtonClick事件
    /// </summary>
    public ObjectEvent PageButtonClick
    {
    get
    {
      return _ButtonClick;
    }
    set
    {
      _ButtonClick= value;
    }
    }
    //事件处理
    private void testMethod(object sender,System.EventArgs e)
    {
       _ButtonClick(sender,e);
    }
    2:
    在引用控件的页面的Page_Load中
    //代理事件
    WebUserControl11.ButtonClick = new ObjectEvent(this.testmethod);/// <summary>
    /// 代理出来事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void testmethod(System.Object sender, System.EventArgs e)
    {
    //你所需要代理出来的事件代码
    }
      

  5.   

    定义用户控件:
    Public Class dd
        Inherits System.Web.UI.UserControl
        Public WithEvents Button1 As System.Web.UI.WebControls.Button
    end class在引用页:
           menu 为用户控件的ID
            init()事件
            Dim bt As Button = Menu.Btn        
            AddHandler bt.Click, AddressOf me_click声明 me_click 事件:
      Private Sub me_click(ByVal s As Object, ByVal e As EventArgs)
            
        End Sub
      

  6.   

    why do you need this line??protected DelegateTest.WebUserControl1 wuc1=new WebUserControl1();
    ===>
    protected DelegateTest.WebUserControl1 wuc1;the instance is already created on the page!!
    here are my testing code:1. DelegateTest.ascx:<%@ Control Language="c#" AutoEventWireup="false" Codebehind="DelegateTest.ascx.cs" Inherits="DelegateTest.WebUserControl1" %>
    <asp:Button id="Button1" Text="Button" runat="server"></asp:Button>2. DelegateTest.ascx.cs:
    namespace DelegateTest
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls; public delegate void ButtonClickEventHandler(object sender,System.EventArgs e); public abstract class WebUserControl1 : System.Web.UI.UserControl
    {
    protected System.Web.UI.WebControls.Button Button1; public event ButtonClickEventHandler ButtonClick;
    private void Page_Load(object sender, System.EventArgs e)
    {
    } #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }

    private void InitializeComponent()
    {
    this.Button1.Click += new System.EventHandler(this.testmethod);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void testmethod(object sender, System.EventArgs e)
    {
    if(ButtonClick!=null)
    ButtonClick(sender,e);
    }
    }
    }
    3. TestDelegate.aspx:<%@ Register TagPrefix="uc1" TagName="WebUserControl1" Src="DelegateTest.ascx" %>
    <%@ Page language="c#" Codebehind="TestDelegate.aspx.cs" AutoEventWireup="false" Inherits="WebApplication7.TestDelegate" %>
    <form id="TestDelegate" method="post" runat="server">
    <uc1:WebUserControl1 id="wuc1" runat="server"></uc1:WebUserControl1>
    </form>
    4. TestDelegate.aspx.cs:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace WebApplication7
    {
    public class TestDelegate : System.Web.UI.Page
    {
    protected DelegateTest.WebUserControl1 wuc1;
    private void Page_Load(object sender, System.EventArgs e)
    {
    } #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }

    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
    wuc1.ButtonClick += new DelegateTest.ButtonClickEventHandler(testmethod); }
    #endregion private void testmethod(object sender, System.EventArgs e)
    {
    Response.Write("<script>alert('OK');</script>");
    }
    }
    }
      

  7.   

    是不是控件的命名空间与WEB页面的命名空间不能一样呀?
      

  8.   

    >>>是不是控件的命名空间与WEB页面的命名空间不能一样呀?they can be same
      

  9.   

    这个项目的其他页面是否也能编译过去,我遇到过类似的问题事件一直为null,不过后来我修改了其他页面让整个项目都编译过去了,这个问题就好了,事件不为空了。
      

  10.   

    你根本就没有对ButtonClick进行赋值,所以,只要去掉if(ButtonClick!=null)即可!即:
    private void testMethod(object sender,System.EventArgs e)
    {
       ButtonClick(sender,e);
    }
      

  11.   

    好像确实不行.
    那个event始终没有实例化.(==null)
    原因可能是因为那个类是abstract class.我也一直很奇怪,不知为何这样.
    试着这样,你可能只是想暴露button的click事件,可不可以暴露这个button.
    public Button btnYourButtomn;
      

  12.   

    把abstract关键字去掉试一下,由于是抽象类会造成无法实例化对象。