首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么让一个按钮对应多个处理情况

2013-10-27 
如何让一个按钮对应多个处理情况?各位高人:菜鸟一枚,请问如下问题:工具栏上有一个确定按钮,在不同的子窗口

如何让一个按钮对应多个处理情况?
各位高人:
  菜鸟一枚,请问如下问题:
  工具栏上有一个确定按钮,在不同的子窗口下,点击“确定”按钮实现不同的处理。即:同一个确定按钮如何处理,在不同的子窗口界面下的情况。举例如:
   如果当前激活子窗口为“查询工单”,我点击确定,就调用相应的函数查询工单;若当前激活子窗口为“查询客户”,就去查客户。
   如果用类似if。。else的语句似乎能处理,总觉不太好,是否有更好的处理模式?

请高人出手!
[解决办法]
1.写一个类继承Form类,如BaseChildForm,其中有个方法,  如ButtonClick
2.每个子窗体继承BaseChildForm,重写ButtonClick方法,内容为“确定"按钮点击事件内容
3.在父窗体中的”确定“按钮事件中写

baseChildForm.ButtonClick();//baseChildForm为子窗体类对象
[解决办法]
楼上的方法蛮好的,类似于依赖注入(DI),还有一种方法就是使用委托(delegate),我就针对委托写个例子吧,比如:
我当前菜单是:

Menu currentMenu = Menu.Menu1;

在不使用委托的时候你需要写if else或者switch语句:
        static void TestWithoutDelegate(Menu menu)
        {
            switch (menu)
            {
                case Menu.Menu1:
                    Console.WriteLine("菜单1");
                    break;
                case Menu.Menu2:
                    Console.WriteLine("菜单2");
                    break;
                case Menu.Menu3:
                    Console.WriteLine("菜单3");
                    break;
                default:
                    break;
            }
        }

然后调用之:
TestWithoutDelegate(currentMenu);


如果使用委托,那么你就需要多写几个方法,类似于:
        static void Menu1()
        {
            Console.WriteLine("菜单1");
        }

        static void Menu2()
        {
            Console.WriteLine("菜单2");
        }

        static void Menu3()
        {
            Console.WriteLine("菜单3");
        }

然后客户端点击了哪个菜单,就使用委托来调用,类似于:
        static void TestWithDelegate(Test del)
        {
            del();
        }

            Test test = Menu1;
            TestWithDelegate(test);

[解决办法]
引用:
小弟愚笨,对委托理解的很差。兄的方法有些懵懂,再问的深入一些。
1.兄的方法似乎是类似于事件处理。具体一下场景:主窗体工具栏按钮上有个“执行”按钮,当不同的子窗体激活时,执行相应子窗体的功能。 于是代码示例如下:
........


你的问题非常好。我认为这正好说明勤于动手的人,很快就会超过只动嘴不动手的人。

实际上,正如你说,所谓“事件”再此处成了一个噱头,把原本不应该“依赖倒置”的关系硬要倒置过来,反而要求“倒置之后再倒置回来”,反而使得原来的干净的分层关系变得乱起来了。

回到你的最初的问题我们可以简单地分析名词和动词,看看对象(类)建模。什么是“当前查询子窗口”呢?

你可以设计一个接口
public interface 当前查询子窗口
{
    void Query();
}


然后你的主窗口可以判断“当前窗口”是不是查询子窗口,例如
var win = ActivedForm as 当前查询子窗口;
if(win!=null)
    win.Query();

这样的编程模式,仅仅比所谓的“条件分支、循环语句”稍微复杂一点,只不过这与基本的控制流语句相比稍微接触一点设计,并不复杂。

热点排行