2015-09-10 3 views
2

У меня есть форма, которая запрашивает у пользователя подтверждение перед запуском BackgroundWorker, который выполняет некоторые вычисления. Эти вычисления могут занять от 10-30 секунд до запуска, и я хочу убедиться, что как только начнутся вычисления, им будет разрешено завершить работу без прерывания.VB.NET Windows Forms - временно отключить кнопку «X»

Есть ли способ временно отключить кнопку «Закрыть» в строке заголовка, пока BackgroundWorker не завершит свою работу?

Я нашел пару похожих вопросов, но они выглядят как более постоянное решение (here и here). Я хочу, чтобы кнопка «Закрыть» была отключена только временно, а BackgroundWorker выполняет свою работу.

Любая помощь будет высоко оценена. Благодаря!

ответ

1
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 
+0

+ 'someLabel.Text =" Занято с помощью Foo. 30 секунд или около того. "' – Plutonix

0

Отключить кнопку закрытия будет очень плохо. Исправьте приложение так, чтобы вычисление могло быть прервано.

+0

Расчет фактически выполняется с помощью веб-службы, в которой я не контролирую. Мой BackgroundWorker отправляет запрос, ждет и делает результаты с результатами. Если форма отменена, я не буду знать, как ответили веб-службы, или если она завершила работу. Есть ли еще одна общепринятая мера, принятая для решения такого рода вещей? – TheIronCheek

+0

@Sam, вам не нужно знать, что он вернул, если форма закрыта. – OneFineDay

0

Я согласен с не скрывая «X», но если вы хотите на самом деле плохо, я думаю, что это здесь является то, что вы ищете:

Disable Close Button in Vb.Net

+0

Как повторно включить его после завершения задачи? – TheIronCheek

+0

'Защищенные переопределения ReadOnly Свойство CreateParams() Как param.ClassStyle = param.ClassStyle И (Not & H200)' Это должно делать работу в рамках одного и того же типа методов – David

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