VB.NET Windows窗体 - 暂时禁用关闭' X'按键

时间:2015-09-10 20:47:21

标签: vb.net backgroundworker

我有一个表单,在运行执行某些计算的BackgroundWorker之前提示用户进行确认。这些计算可能需要10-30秒才能运行,我想确保一旦计算开始运行,它们就可以不间断地完成。

有没有办法暂时禁用标题栏中的关闭按钮,直到BackgroundWorker完成其工作?

我发现了几个类似的问题,但它们看起来像是一个更永久的解决方案(herehere)。我希望在BackgroundWorker完成工作时暂时禁用关闭按钮。

非常感谢任何帮助。谢谢!

4 个答案:

答案 0 :(得分:2)

Private ImBusy As Boolean = False

Private Sub LookBusyForTheBoss()
    Me.UseWaitCursor = True
    Me.Cursor = Cursors.WaitCursor
    Me.Enabled = False
    ProgressBar1.UseWaitCursor = False
    ProgressBar1.Style = ProgressBarStyle.Marquee

    ImBusy = True
End Sub

Private Sub Form77_FormClosing(...) Handles Me.FormClosing
    If ImBusy Then e.Cancel = True
End Sub

Private Sub OkHeIsGone()
    Me.UseWaitCursor = False
    Me.Cursor = Cursors.Default
    Me.Enabled = True

    ImBusy = False
End Sub

答案 1 :(得分:0)

禁用关闭按钮会极其糟糕。修复您的应用程序,以便可以中断计算。

答案 2 :(得分:0)

我同意不隐藏' X'但如果你真的想要它,我认为这就是你要找的东西:

Disable Close Button in Vb.Net

答案 3 :(得分:0)

这些方面的某些内容可能有效:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    doNotClose = True
    Do
        '
        'etc
        '
        'simulate long running 
        For x As Integer = 1 To 1000
            Threading.Thread.Sleep(10)
        Next
        Exit Do
    Loop
    doNotClose = False
    If closerequested Then
        Me.BeginInvoke(Sub()
                           Me.Close()
                       End Sub)
    End If
End Sub

Dim doNotClose As Boolean = False
Dim closerequested As Boolean = False

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    closerequested = True
    If doNotClose Then
        e.Cancel = True
        Exit Sub
    End If
End Sub

或者

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    doNotClose = True
    Do
        '
        'etc
        '
        'simulate long running 
        For x As Integer = 1 To 1000
            Threading.Thread.Sleep(10)
        Next
        Exit Do
    Loop
    doNotClose = False
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If closerequested Then
        Me.Close()
    End If
End Sub

Dim doNotClose As Boolean = False
Dim closerequested As Boolean = False

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    closerequested = True
    If doNotClose Then
        e.Cancel = True
        Exit Sub
    End If
End Sub