在SAP B1的使用过程中,发现他存在相当多的优点。今天只说他的相对模态窗体。一般情况下我们所开发的winform程序,在对弹出窗体进行处理时,都比较不乐意用弹出窗体。因为如果使用模态窗体,就失去了程序的多任务特性;如果不使用模态窗体,又怕因为用户误操作造成麻烦。我以前在做程序时一直处理两难之中。
而当我发现SAP B1的用户界面时,给了我一些启发:他用的是相对模态窗体!(我们这样称呼吧)。如果我们打开一个销售订单,再打开一个选择客户主数据的窗体,那么这个客户选择窗体就是这个销售订单窗体的模态窗体。而此时我们还可以打开别的窗体,如采购订单。甚至可以再打开一个销售订单!而当我们选择或者叫激活最初的销售订单窗体时,仍只能对针对于他的模态窗体进行操作。效果非常好!
今天,我利用父窗体的Move和Actived事件,实现了这一功能。
一、首先要建立一个MDI窗体。
二、然后创建一个子窗体,在这个窗体上添加一个按钮。btnShowDialog。添加如下代码:
1
private void btnShowDialog_Click(object sender, EventArgs e)
2
{
3
fd= new FrmDialog();
4
fd.Show();
5
}
三、在父窗体上添加如下代码:
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
1
// 用来声明子窗体对象
2
FrmDialog fd;
3![](/Images/OutliningIndicators/None.gif)
4
private void FrmSalesOrder_Move(object sender, EventArgs e)
5
{
6
if (fd != null)
7
fd.Activate();
8
}
9![](/Images/OutliningIndicators/None.gif)
10
private void FrmSalesOrder_Activated(object sender, EventArgs e)
11
{
12
if (fd != null)
13
fd.Activate();
14
else
15
this.Activate();
16
}
这样就可以实现了。
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)