如何让一个按钮对应多个处理情况?
各位高人:
菜鸟一枚,请问如下问题:
工具栏上有一个确定按钮,在不同的子窗口下,点击“确定”按钮实现不同的处理。即:同一个确定按钮如何处理,在不同的子窗口界面下的情况。举例如:
如果当前激活子窗口为“查询工单”,我点击确定,就调用相应的函数查询工单;若当前激活子窗口为“查询客户”,就去查客户。
如果用类似if。。else的语句似乎能处理,总觉不太好,是否有更好的处理模式?
请高人出手!
[解决办法]
1.写一个类继承Form类,如BaseChildForm,其中有个方法, 如ButtonClick
2.每个子窗体继承BaseChildForm,重写ButtonClick方法,内容为“确定"按钮点击事件内容
3.在父窗体中的”确定“按钮事件中写
baseChildForm.ButtonClick();//baseChildForm为子窗体类对象
[解决办法]
楼上的方法蛮好的,类似于依赖注入—I),还有一种方法就是使用委托(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);
[解决办法]
你的问题非常好。我认为这正好说明勤于动手的人,很快就会超过只动嘴不动手的人。
实际上,正如你说,所谓“事件”再此处成了一个噱头,把原本不应该“依赖倒置”的关系硬要倒置过来,反而要求“倒置之后再倒置回来”,反而使得原来的干净的分层关系变得乱起来了。
回到你的最初的问题我们可以简单地分析名词和动词,看看对象(类)建模。什么是“当前查询子窗口”呢?
你可以设计一个接口
public interface 当前查询子窗口
{
void Query();
}
然后你的主窗口可以判断“当前窗口”是不是查询子窗口,例如
var win = ActivedForm as 当前查询子窗口;
if(win!=null)
win.Query();
这样的编程模式,仅仅比所谓的“条件分支、循环语句”稍微复杂一点,只不过这与基本的控制流语句相比稍微接触一点设计,并不复杂。