代码:
MoveDrop.ascx.cs中的代码:    public void Button1_Click(object sender, EventArgs e)
    {
        ClickEventArgs el = new ClickEventArgs();
        ButtonClick(this, el);
    }
        public delegate void ClickHander(object sender, ClickEventArgs e);
        public event ClickHander ButtonClick;
}
public class ClickEventArgs : EventArgs
{
    public string abc = "saas";
}news.aspx.cs中的代码:    protected MoveDrop move = new MoveDrop();
    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.Page_Load);
        this.move.ButtonClick += new MoveDrop.ClickHander(move_ButtonClick);
    }    void move_ButtonClick(object sender, ClickEventArgs e)
    {
        throw new NotImplementedException();
        Label1.Text = e.abc;
    }问题:
在news页面中点击Button1,出现错误提示:
“未将对象引用设置到对象的实例”求助:
怎样解决这个问题,是什么地方出错?
求教,谢谢

解决方案 »

  1.   

    看了半天不知道LZ想干什么,代码比较乱,不全!关于怎么自定义事件请参考MSDN:如何:发布符合 .NET Framework 准则的事件(C# 编程指南)
      

  2.   

    using System;
    namespace MyCollections 
    {
       using System.Collections;   // A delegate type for hooking up change notifications.
       public delegate void ChangedEventHandler(object sender, EventArgs e);   // A class that works just like ArrayList, but sends event
       // notifications whenever the list changes.
       public class ListWithChangedEvent: ArrayList 
       {
          // An event that clients can use to be notified whenever the
          // elements of the list change.
          public event ChangedEventHandler Changed;      // Invoke the Changed event; called whenever list changes
          protected virtual void OnChanged(EventArgs e) 
          {
             if (Changed != null)
                Changed(this, e);
          }      // Override some of the methods that can change the list;
          // invoke event after each
          public override int Add(object value) 
          {
             int i = base.Add(value);
             OnChanged(EventArgs.Empty);
             return i;
          }      public override void Clear() 
          {
             base.Clear();
             OnChanged(EventArgs.Empty);
          }      public override object this[int index] 
          {
             set 
             {
                base[index] = value;
                OnChanged(EventArgs.Empty);
             }
          }
       }
    }namespace TestEvents 
    {
       using MyCollections;   class EventListener 
       {
          private ListWithChangedEvent List;      public EventListener(ListWithChangedEvent list) 
          {
             List = list;
             // Add "ListChanged" to the Changed event on "List".
             List.Changed += new ChangedEventHandler(ListChanged);
          }      // This will be called whenever the list changes.
          private void ListChanged(object sender, EventArgs e) 
          {
             Console.WriteLine("This is called when the event fires.");
          }      public void Detach() 
          {
             // Detach the event and delete the list
             List.Changed -= new ChangedEventHandler(ListChanged);
             List = null;
          }
       }   class Test 
       {
          // Test the ListWithChangedEvent class.
          public static void Main() 
          {
          // Create a new list.
          ListWithChangedEvent list = new ListWithChangedEvent();      // Create a class that listens to the list's change event.
          EventListener listener = new EventListener(list);      // Add and remove items from the list.
          list.Add("item 1");
          list.Clear();
          listener.Detach();
          }
       }
    }
      

  3.   

    protected MoveDrop move = new MoveDrop(); 这是啥意思呢?这跟Button1有什么关系呢?说的明白一点,你怎知道你点击的Button1就是这个move变量里边的呢?虽然你写了:   this.move.ButtonClick += new MoveDrop.ClickHander(move_ButtonClick); 可是你并没有给你所看到的Button1所在的MoveDrop控件实例注册ButtonClick,因此你的没有预先判断是否“ButtonClick!=null”的代码        ButtonClick(this, el); 就出错了。但是这个出错不是关键,关键是你的代码也没有说明你所用眼睛看到的Button1到底是哪一个控件实例上的,反正从你的代码上丝毫也看不出它一定是“new MoveDrop()”所产生的对象上的。你这样写“new MoveDrop()”则是很奇怪的逻辑,我也不知道怎样说你更合适,我希望你说明你为什么要这样写“new MoveDrop()”呢?
      

  4.   

    参考
    http://www.cnblogs.com/emanlee/archive/2008/01/21/1047242.html
    http://www.cnblogs.com/syveen/archive/2007/06/25/795259.html
    http://www.cnblogs.com/professor/archive/2008/10/28/1320935.html
      

  5.   

    换个说法,就是在用户控件里面有一个Button1,当点击Button1时,在加载用户控件的页面里生成一个Button1的Click事件,在这个事件里面对用户控件取得的值进行操作,而不是在加载用户控件的页面上添加一个按钮来处理用户控件取得的值
      

  6.   

    还是退回到比较基本的“如何装载用户控件”的问题上来吧。最简单的做法,是删除“protected MoveDrop move = new MoveDrop(); ”这一条语句,然后老老实实地用鼠标把用户拖到页面的设计窗口上,然后你再在页面的.cs中的Page_Load事件处理程序中为这个鼠标拖入的用户控件的this.move.ButtonClick注册处理程序。如果你想复杂一点,想动态LoadControl装载用户控件,在这条LoadControl语句所在的地方,注册ButtonClick注册处理程序。
      

  7.   

    除了写代码来注册事件处理程序以外,也可以在拖入用户控件之后直接写ButtonClick属性代码,例如:<uc1:MoveDrop runat="server" ID="MoveDrop1" ButtonClick="move_ButtonClick" ..... />protected void move_ButtonClick(object sender, ClickEventArgs e) 
    {
    .....
    }