none
按钮问题 RRS feed

  • 问题

  • onclick 事件有个代码

    label1.text="text"

    如何在这个代码之前执行指定的代码。
    当然,最简单的就是在语句之前加一段代码,但如果按钮有很多呢?
    我的想法是遍历控件,如果是按钮,就加指定代码,但指定代码要在原来代码之前执行。
    不知有没办法实现?

    2010年1月11日 23:39

答案

  • 1) 如果你非要在Button 对象的Click 之前做些事情的话,你可以创建一个新的类MyButton : public Button 继承于Button 类,然后override Button类的OnClick 函数,在那里面做动作。

    2) 如果在Click事件中做动作,可以通过判断sender 的类型,来指导这个click事件是不是Button 类型的对象发出来的。 if(sender as button){ 指定的代码}
    • 已标记为答案 ogra 2010年1月12日 6:41
    2010年1月12日 0:39
  • 可以使用委托和事件来执行,你可以像Michael所说继承一个button类
    在你继承button类里自定义一个事件,比如
        public class but : Button
        {
            public delegate void DoSomeThingBeforeButtonClick(object sender, EventArgs e);
            public event DoSomeThingBeforeButtonClick DoSth;
            //安全引发DoSth事件
            public void OnDoSth()
            {
                if (DoSth != null)
                    DoSth(this, EventArgs.Empty);
            }
            protected override void OnClick(EventArgs e)
            {
                OnDoSth();
                base.OnClick(e);
            }
        }
    而你在客户端使用的时候只需要
        protected void Page_Load(object sender, EventArgs e)
        {
            but button = new but();
            button.DoSth += new but.DoSomeThingBeforeButtonClick(DoSth);
        }

        void DoSth(object sender, EventArgs e)
        {
            //这里实现你要在button click之前的代码
        }
    貌似我的方法麻烦点..但是用的多的话肯定会轻松的

    • 已建议为答案 CareySon 2010年1月12日 1:13
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 1:12
  • 你好!
         如果你的按钮的Click事件的处理方式都相同,只要定义一个处理函数就可以了,然后所有按钮的Click事件都指定这个处理函数!
         如果你的按钮的Click事件的处理方式不相同,如果按钮不是很多的情况下,我也不建议自定义按钮,提供自己的事件,因为你的本意是简化代码,这样反而增加了代码的复杂度给维护带来不必要的麻烦!
         一个建议是直接把要执行的代码封装成一个方法,在事件处理程序中调用这个方法就可以了!
    周雪峰
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 3:33
    版主
  • 除了上面的方式,如果只是简单的在给 Label 设置 Text 值时需要执行一段代码,可以考虑扩展这个 Label 如:

    public class XLabel : Label
    {
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                // 你的代码
                base.Text = value;
            }
        }
    }

    另外一般的做法就是,每个事件中都调用一个方法,在方法在执行你的代码块,以后逻辑发生变化只需要修改一处。

    知识改变命运,奋斗成就人生!
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 4:40
    版主

全部回复

  • 1) 如果你非要在Button 对象的Click 之前做些事情的话,你可以创建一个新的类MyButton : public Button 继承于Button 类,然后override Button类的OnClick 函数,在那里面做动作。

    2) 如果在Click事件中做动作,可以通过判断sender 的类型,来指导这个click事件是不是Button 类型的对象发出来的。 if(sender as button){ 指定的代码}
    • 已标记为答案 ogra 2010年1月12日 6:41
    2010年1月12日 0:39
  • 可以使用委托和事件来执行,你可以像Michael所说继承一个button类
    在你继承button类里自定义一个事件,比如
        public class but : Button
        {
            public delegate void DoSomeThingBeforeButtonClick(object sender, EventArgs e);
            public event DoSomeThingBeforeButtonClick DoSth;
            //安全引发DoSth事件
            public void OnDoSth()
            {
                if (DoSth != null)
                    DoSth(this, EventArgs.Empty);
            }
            protected override void OnClick(EventArgs e)
            {
                OnDoSth();
                base.OnClick(e);
            }
        }
    而你在客户端使用的时候只需要
        protected void Page_Load(object sender, EventArgs e)
        {
            but button = new but();
            button.DoSth += new but.DoSomeThingBeforeButtonClick(DoSth);
        }

        void DoSth(object sender, EventArgs e)
        {
            //这里实现你要在button click之前的代码
        }
    貌似我的方法麻烦点..但是用的多的话肯定会轻松的

    • 已建议为答案 CareySon 2010年1月12日 1:13
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 1:12
  • 你好!
         如果你的按钮的Click事件的处理方式都相同,只要定义一个处理函数就可以了,然后所有按钮的Click事件都指定这个处理函数!
         如果你的按钮的Click事件的处理方式不相同,如果按钮不是很多的情况下,我也不建议自定义按钮,提供自己的事件,因为你的本意是简化代码,这样反而增加了代码的复杂度给维护带来不必要的麻烦!
         一个建议是直接把要执行的代码封装成一个方法,在事件处理程序中调用这个方法就可以了!
    周雪峰
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 3:33
    版主
  • 除了上面的方式,如果只是简单的在给 Label 设置 Text 值时需要执行一段代码,可以考虑扩展这个 Label 如:

    public class XLabel : Label
    {
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                // 你的代码
                base.Text = value;
            }
        }
    }

    另外一般的做法就是,每个事件中都调用一个方法,在方法在执行你的代码块,以后逻辑发生变化只需要修改一处。

    知识改变命运,奋斗成就人生!
    • 已标记为答案 ogra 2010年1月12日 6:42
    2010年1月12日 4:40
    版主