以模态方式将表单保存在另一个表单的顶部,但继续执行

时间:2012-04-18 16:41:10

标签: vb.net winforms

我在一个名为PolicyRefreshStatus.vb的vb.net Windows窗体应用程序中有一个表单,它上面有一个ProgressBar控件。从名为EditPolicy.vb的主窗体我需要在EditPolicy.vb之上显示PolicyRefreshStatus.vb - 但事情是有线的我控制ProgressBar,它是EditPolicy.vb内部逻辑的步骤。

如果我使用.show()方法显示PolicyRefreshStatus.vb栏,一切正常。问题是如果用户点击主表单然后PolicyRefreshStatus.vb失去焦点。如果我使用.ShowDialog()将PolicyRefreshStatus.vb显示为模式形式,则在.ShowDialog()语句之后,执行将在EditPolicy.vb中停止。

所以例如在代码中:

 mPolicyRefreshStatus = New PolicyRefreshStatus
 mPolicyRefreshStatus.pbMax = mPolicy.ClaimsUpdateMax
 mPolicyRefreshStatus.ShowDialog()
 mPolicy.UpdateFromFIS() 

mPolicy.UpdateFromFIS()行永远不会执行,因为它正在等待PolicyRefreshStatus表单关闭。

如何以模态形式显示PolicyRefreshStatus,但让EditPolicy.vb继续执行?

2 个答案:

答案 0 :(得分:0)

您无法以模态方式显示表单并让您的例程继续。您必须以非模态方式显示表单,然后执行其他操作,在完成后关闭表单。可能是一个循环,直到任务完成?

将Show()与父表单参数一起使用将为您提供更好的可用性。更像是一个工具窗口。

答案 1 :(得分:0)

你有几个相关的选择。

首先是以委托或实现接口的类的形式将工作单元传递给进度条。像这样的东西(没有检查正确性,只是一个粗略的例子):

mPolicyRefreshStatus = New PolicyRefreshStatus  
mPolicyRefreshStatus.pbMax = mPolicy.ClaimsUpdateMax  
mPolicyRefreshStatus.UnitOfWork = AddressOf(mPolicy.UpdateFromFIS())
mPolicyRefreshStatus.ShowDialog()  

然后在进度表单中,您可以回调实际完成工作的例程。

另一种方法是在ProgressForm上定义事件,然后拥有/启动对象可以处理这些事件来完成工作。使用此选项,您可以创建一组相当详细的事件,以便能够处理增量工作或取消,但概念是一样的,你正在从进度表调用回启动器来执行实际的业务逻辑。