2017-02-16 3 views
1

У меня есть приложение Winforms, которое должно уведомить пользователя, когда что-то в базе данных изменится. Для этого я использую Sql-Dependencys, который отлично работает. Когда срабатывает Dependency, я могу показать форму с некоторыми кнопками, чтобы пользователь мог решить, что он хочет делать. После одной кнопки я хочу показать диалог, но первый диалог всегда закрывается мгновенно. Единственное исправление, которое я нашел до сих пор, это восстановление базовой формы и ее активация, но это не то решение, которое я ищу. Для кода я делаю следующее:Форматирование формы Windows Formal мгновенно закрывается, когда базовая форма не активна

Этот метод вызывается, когда что-то меняется в базе данных

Private Sub NutzerBenachrichtigen(Aenderung As Aenderung) 
    If InvokeRequired Then 
     Me.BeginInvoke(New MethodInvoker(Sub() 
              ErzeugeBenachrichtigung(Aenderung) 
             End Sub)) 
    Else 
     ErzeugeBenachrichtigung(Aenderung) 
    End If 
End Sub 

Этот метод отображает первую форму (HeadsUp берется из этого здесь: https://github.com/glm9637/MaterialWinforms/blob/master/MaterialWinforms/Controls/HeadsUp.cs)

Private Sub ErzeugeBenachrichtigung(ByVal Aenderung As Aenderung) 
    If Aenderung.istAktuellerBenutzer Then 
     Dim objHeadsUp As New HeadsUp() 
     objHeadsUp.Titel = "Neue Aenderung" 
     If Aenderung.EventTyp.ToLower = "alter" Then 
      objHeadsUp.Text = String.Format("Du hast etwas an {0} {1} {2} geändert. {3}Willst du etwas dazu schreiben?", _ 
            If(Aenderung.BetroffenesObjekt.EntitaetTyp.Name = New EntitaetTyp.Trigger().Name, "dem", "der"), _ 
            Aenderung.BetroffenesObjekt.EntitaetTyp.Name, Aenderung.BetroffenesObjekt.Name, vbNewLine) 
     Else 
      objHeadsUp.Text = String.Format("Du hast {0} {1} {2} erstellt. {3}Willst du etwas dazu schreiben?", _ 
            If(Aenderung.BetroffenesObjekt.EntitaetTyp.Name = New EntitaetTyp.Trigger().Name, "den", "die"), _ 
            Aenderung.BetroffenesObjekt.EntitaetTyp.Name, Aenderung.BetroffenesObjekt.Name, vbNewLine) 
     End If 
     objHeadsUp.Tag = Aenderung.BetroffenesObjekt 
     Dim objButtonSchliessen = New MaterialFlatButton 
     objButtonSchliessen.Tag = objHeadsUp 
     objButtonSchliessen.Text = "Schliessen" 
     AddHandler objButtonSchliessen.Click, AddressOf SchliesseHeadsUp 
     objHeadsUp.Buttons.Add(objButtonSchliessen) 
     Dim objButtonHistorie = New MaterialFlatButton 
     objButtonHistorie.Tag = objHeadsUp 
     objButtonHistorie.Text = "Historieneintrag" 
     AddHandler objButtonHistorie.Click, AddressOf HistorienEintragHinzufuegen 
     objHeadsUp.Buttons.Add(objButtonSchliessen) 
     Dim objButtonDokumentation = New MaterialFlatButton 
     objButtonDokumentation.Tag = objHeadsUp 
     objButtonDokumentation.Text = "Dokumentation" 
     AddHandler objButtonDokumentation.Click, AddressOf DokumentationBearbeiten 
     objHeadsUp.Buttons.Add(objButtonSchliessen) 
     objHeadsUp.Buttons.Add(objButtonHistorie) 
     objHeadsUp.Buttons.Add(objButtonDokumentation) 
     objHeadsUp.Show() 

    ElseIf Aenderung.EventTyp = "CLOSE_MESSAGE" Then 
     Dim objHeadsUp As New HeadsUp() 
     objHeadsUp.Titel = "Achtung" 
     objHeadsUp.Text = "Die Anwendung muss für eine Aktualisierung geschlossen werden." 
     Dim objButtonSchliessen = New MaterialFlatButton 
     objButtonSchliessen.Tag = objHeadsUp 
     objButtonSchliessen.Text = "Anwendung Schliessen" 
     AddHandler objButtonSchliessen.Click, AddressOf AnwendungSchliessen 
     objHeadsUp.Buttons.Add(objButtonSchliessen) 
     objHeadsUp.Show() 
    Else 
     If mtc_UebersichtTabControl.SelectedTab.Text = "Aenderung" Then 
      mAenderungenUebersicht.Aktualisieren() 
     End If 
    End If 
End Sub 

Наконец, когда кнопка "Historieneintrag" нажата этот метод вызывается:

Private Sub HistorienEintragHinzufuegen(sender As Object, e As EventArgs) 
    Dim blnNachDialogVerstecken As Boolean = False 
    Dim objFlatButton As MaterialFlatButton = sender 
    Dim HeadsUp As HeadsUp = objFlatButton.Tag 
    Dim Objekt As Entitaet = HeadsUp.Tag 
    Dim objOldLocation As System.Drawing.Point = Location 
    HeadsUp.Close() 
    Dim objDialogContent As New HistorienEintrag() 
    ''Hacky: Ansonsten wird der Dialog sofort geschlossen 
    If WindowState = FormWindowState.Minimized Or Not Visible Then 
     Location = New System.Drawing.Point(-Width * 2, -Height - 2) 
     Me.Show() 
     blnNachDialogVerstecken = True 
    End If 
    Activate() 

    If MaterialDialog.Show("Neuer Historien Eintrag", objDialogContent, MaterialWinforms.Controls.MaterialDialog.Buttons.OKCancel, MaterialDialog.Icon.Info) = DialogResult.OK Then 
     Objekt.HistorieSpeichern(objDialogContent.Ergebniss) 
    End If 

    If blnNachDialogVerstecken Then 
     Me.Hide() 
     Location = objOldLocation 
    End If 

End Sub 

Здесь первая модальная форма, поэтому MessageBox.Show ("") или любая другая форма закрывается мгновенно, если я не делаю шоу и не активирую часть. Что я здесь делаю неправильно?

+0

Почему заявление HeadsUp.Close? –

+0

, потому что мне больше не нужно его отображать – glm9637

+0

Я предполагаю, что меня смущает ваш код/​​вопрос..nvm –

ответ

0

Project> (проект) Свойства> Application> режим Shutdown

изменения с момента, когда форма запуска закрывается, когда последняя форма закрывается

+0

Но мое приложение не закрывается, только диалог делает. – glm9637