我在一个名为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继续执行?
答案 0 :(得分:0)
您无法以模态方式显示表单并让您的例程继续。您必须以非模态方式显示表单,然后执行其他操作,在完成后关闭表单。可能是一个循环,直到任务完成?
将Show()与父表单参数一起使用将为您提供更好的可用性。更像是一个工具窗口。
答案 1 :(得分:0)
你有几个相关的选择。
首先是以委托或实现接口的类的形式将工作单元传递给进度条。像这样的东西(没有检查正确性,只是一个粗略的例子):
mPolicyRefreshStatus = New PolicyRefreshStatus
mPolicyRefreshStatus.pbMax = mPolicy.ClaimsUpdateMax
mPolicyRefreshStatus.UnitOfWork = AddressOf(mPolicy.UpdateFromFIS())
mPolicyRefreshStatus.ShowDialog()
然后在进度表单中,您可以回调实际完成工作的例程。
另一种方法是在ProgressForm上定义事件,然后拥有/启动对象可以处理这些事件来完成工作。使用此选项,您可以创建一组相当详细的事件,以便能够处理增量工作或取消,但概念是一样的,你正在从进度表调用回启动器来执行实际的业务逻辑。