请问为什么控件的事件响应函数不能是private 而可以是protected的啊?
请高手讲详细点哈!

解决方案 »

  1.   

    首先你要搞清楚private和protected的区别
    private:私有的
    protected:在子类中可见如果一个控件的事件使用了protected,那么,当别的类继承了这个控件时,子类仍然可以使用父类的事件好像是这样
      

  2.   

    aspx页面<asp:MultiView ... OnActiveViewChange="MultiView1_ActiveViewChanged" ...>
    ...
    ...
    </asp:MultiView>cs页面protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
      

  3.   


    加上补充:
    aspx要继承cs页面类
      

  4.   

    aspx页面上继承cs页面的类如果是private修饰符,则aspx页面最后编译的类,无法访问到该方法,故...
      

  5.   

    aspx页面上继承cs页面的类如果是private修饰符,则aspx页面最后编译的类,无法访问到该方法,故...
      

  6.   

    如果是aspx编译成继承cs类的类话,就说的通了,谢谢哈
      

  7.   

    完全可以。
    只是在VS2005的WEB Site编程模型下有一个特殊的机制用于动态生成委托
    所以方法必须是Protected及其以上的访问级别
    而如果我们手动添加委托的话,方法可以是 private,代码如下Page_Load() {
      this.button1.OnClick += new System.EventHandler(button1_Click)
    }private void button1_Click(Object sender, EventArgs e) {
      // 代码完全没有问题
    }
      

  8.   

    楼上兄弟们都说了,呵呵,protected是为了给前台用的,因为aspx继承自aspx.cs,当然,也可以在aspx.cs里面load的时候加载事件,这样就可以private
      

  9.   

    子类的事件响应应该继承
    还有一个就是在html中可用Js调该方法
      

  10.   

    到底是aspx和cs之间是什么关系啊?
      

  11.   

    谢谢你提出的使用private的方法
    能帮我解答一下为什么我那种不能使用private吗?
      

  12.   


    当然,但只能保证实现逻辑的正确,不保证微软就是这样做的。
    首先,aspx页面也是需要编译的,它会编译成它的后台CS类的一个子类
    在编译的过程中
    如果碰到runat="server"这样的标签,编译器就会检查事件的定义,之后加入委托(在VS2003中,这一步都是通过设计器创建实实在在的代码来完成,而在VS2005中,隐藏了这一步的实现)
    例如,在 a.aspx 页面
    编译器发现下面的代码 <asp:Button id="button1" runat="server" onclick="button1_Click" />
    那么编译后的代码应该为public class ___a : a {  ...
        base.button1.OnClick += new System.EventHandler(base.button1_Click);  // 因为 button1_Click(object, EventArgs)方法并不是声明在 ___a 中,
      // 而是在它的父类当中,所以,要保证 button1_Click 的正常调用,需要 button1_Click 的访问级别至少为 Protected
      ...
    }a.aspx.cs 代码如下
    public class a {
        protected void button1_Click(object sender, EventArgs e) {
          // 该方法的访问级别至少需要 Protected,以保证 ___a 可以对它的调用
        }
    }