Problem mit else-Zweig nach Timer-Ablauf

bolshi

Mitglied
Hallo,
im aktuellen Projekt soll ein Timer mind. so lange laufen, bis die Verbindung zur Datenbank mittels NTAuthentifizierung stattfand. Max. jedoch 10s. Die Verbindung zur DB findet wie folgt statt:

Code:
Try
Dim con As SqlConnection = _
New SqlConnection("Data Source=localhost;" & _
"Initial Catalog=pubs;Trusted_Connection=yes")
con.Open()
Catch e As Exception
' Anweisungen
End Try

Der Timer-Code:

Code:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ProgressBar1.Maximum = 10
        ProgressBar1.Minimum = 0
        ProgressBar1.Value = 0
        ProgressBar1.Step = 1
        Timer1.Interval = 1000
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If Timer1.Enabled = False Then
            ProgressBar1.Value = 0
            Timer1.Start()

        Else
            'Beginn der manuellen Verbindung

        End If

    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ProgressBar1.PerformStep()

        If Timer1.Enabled = False Then ProgressBar1.PerformStep()
        If ProgressBar1.Value = 12 Then Timer1.Stop()

    End Sub

    Private Sub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgressBar1.Click

    End Sub
End Class

Wie muss ich die Abbruchbedingung gsetzen, dass bei erfolgreicher autom. DB-Verbindung mein Popup kommt:

Code:
message.show("Erfolgreich verbunden")

Nachdem "ProgressBar1.Maximum erreicht ist und die autom. Verbindung nicht erfolgte, soll die Verbindung manuell stattfinden:

Code:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If Timer1.Enabled = False Then
            ProgressBar1.Value = 0
            Timer1.Start()

        ElseIf (ProgressBar1.Maximum = True) Then
            'Beginn der manuellen Verbindung
            MessageBox.Show("Beginn der manuellen Verbindung")
        End If

    End Sub

Mit einer if-Anweisung bekomme ich einen Syntaxfehler. Mit elseif läuft die Anwendung durch. Allerdings kommt das Popup nicht.
 
Was verstehst du da eigentlich unter einer manuellen Verbindung?

Du könntest das auch ganz anders machen ... Setze das Timeout bei deinem ConnectionString auf 10 Sekunden. Währen conn.Open() aufgerufen wird, zeigst du eben dienen Screen an. Wird dieser Schritt erfolgreich durchgeführt kannst du das Fenster wieder ausbleden, denn dann -> angemeldet.

Kommt eine Exception, weil das Timeout überschritten wurde, dann machst du deine manuelle Anmeldung (vermutlich meinst du damit die Eingabe der Verbindungsdaten). Dazu brauchst du also nicht unbedingt einen Timer.
 
Was verstehst du da eigentlich unter einer manuellen Verbindung?

Du könntest das auch ganz anders machen ... Setze das Timeout bei deinem ConnectionString auf 10 Sekunden. Währen conn.Open() aufgerufen wird, zeigst du eben dienen Screen an. Wird dieser Schritt erfolgreich durchgeführt kannst du das Fenster wieder ausbleden, denn dann -> angemeldet.

Kommt eine Exception, weil das Timeout überschritten wurde, dann machst du deine manuelle Anmeldung (vermutlich meinst du damit die Eingabe der Verbindungsdaten). Dazu brauchst du also nicht unbedingt einen Timer.

Der Timer ist insofern wichtig, weil es bei uns sogenannte dau's gibt. Es muss also unbedingt was passieren bis die Verbindung hergestellt wird. Das muss nicht unbedingt eine ProgressBar sein. Mir ist aus Gründen des neu dabei Seins nichts passenderes eingefallen.

Der if-Zweig ist soweit klar:

Code:
Try
        Dim con As SqlConnection = New SqlConnection("Data Source=localhost;" & _
                                                   "Initial Catalog=pubs;Connect Timeout=10;" & _
                                                   "Trusted_Connection=yes")
             con.Open()
         Catch e As Exception
                ' Anweisungen
                e.Message("Fehler in der DB-Connection")
End Try
Wäre super, wenn mir einer sagen könnte, wie das else bei meiner DB-Verbindung aussehen muss und wie ich es anstelle, dass im else-Fall und auch wirklich erst dann die Eingabefenster für die manuelle Anmeldung mit Benutzername und Passwort erscheinen.
 
Statt dem Timer kannst du beispielsweise eine animierte Grafik verwenden.

Am besten erstellst du die Controls bereits auf derselben Form und blendest sie zu Beginn einfach nur aus. Im else-Zweig kannst du diese dann ja einblenden und die Progressbar ausblenden. Damit brauchst du kein zweites Formular und kannst alles über eines abdecken.
 
Code:
        If Timer1.Enabled = False Then
            ProgressBar1.Value = 0
            Timer1.Start()

            'Textboxen verstecken
        fldTextBox_1.Visible = False
            fldTextBox_2.Visible = False

            'Versuch die DB zu verbinden
            Try
                Dim con As SqlConnection = New SqlConnection("Data Source=localhost;" & _
                                                             "Initial Catalog=pubs;Connect Timeout=10;" & _
                                                             "Trusted_Connection=yes")
                con.Open()
            Catch e As Exception
                ' Anweisungen
                e.Message("Fehler in der DB-Connection")
            End Try

          ElseIf (ProgressBar1.Maximum = True) Then
            'Beginn der manuellen Verbindung
             ...

        End If

Ich kann beim besten Willen nicht sagen, warum die Textboxen nach wie vor sichtbar sind. Wäre super, wenn noch wer einen Tipp hätte, wie ich die Progressbar derart zum laufen kriege, dass die Anwendung nach erreichen des max. Wertes der Progressbar in den else-Zweig geht.
 
Ich habe das jetzt nicht im Kopf, aber du kannst irgendwo im ProgressBar den Style festlegen, dort müsste es eine Option Marquee geben, mit dieser Einstellung füllt sich der Progressbar nicht mehr mit jeden Step sondern läuft nur durch... (So ähnlich wie das aussieht wenn man WinXP startet ;))
 
Hallo,

danke für eure Tipps. Ich denke, dass an dem bisher von mir Geposteten für euch nicht klar wird wo ich hin will. Ich versuche noch mal step by step mein Projekt zu beschreiben.

Auf der Windows-Forms gibt es 2 Textboxen, 1 Drop-Down-Feld, eine Progressbar und einen Button.

Starte ich per Click auf den Button die Anwendung, läuft die Progressbar hoch bis sie das Max. von 10sec erreicht hat. Innerhalb dieser Zeit sind Textfelder und Dropdown-Feld "visible=false".

Währenddessen soll der Benutzer mit seiner NT-Authentifikation an eine Datenbank angemeldet werden. Klappt dies innerhalb der 10sec nicht, geht die Anwendung in den else-Zweig. Im else-Zweig werden die beiden Texboxen und das Dropdown-Feld per "visible = true" gesetzt und der Benutzer bekommt so die Möglichkeit sich "manuell" an die DB anzumelden.

Nach erfolgreicher Anmeldung kommt ein popup, welches die erfolgreiche Verbindung mit der DB bestätigt.

Ich hoffe das erklärt mehr als mein Code :)



Gruß

Ingo
 
Wir haben dich schon verstanden.

Aber wenn du das unbedingt so gelöst haben willst, wie du es dir vorstellst:

Im Else-Zweig deine TextBoxen etc. auf Visible=true setzen. Wenn die Eingaben erfolgt sind, muss der Benutzer auf den Button klicken. Darin wird überprüft ob die manuelle Variante zu tragen kommt, baut den ConnectionString neu zusammen und startet den Verbindungsprozess (siehe deine 10 Sekunden) wieder von vorne. Wenn erfolgreich, dann kannst du eine MessageBox anzeigen, wenn nicht, dann ein anderer Hinweis, dass die Daten nicht korrekt waren, oder ein Verbindungsaufbau nicht möglich war.
 
Selbst wenn ich den Textboxen unten rechts im Eigenschaftenfenster per default "visible=false" gebe, erscheinen sie beim starten des Debuggers in alter Frische.

Momentan kann ich nicht debuggen. Die erste Fehlermeldung taucht im Catch-Block der SqlConnection innerhalb des if-Zweigs mit folgender Meldung auf:

Code:
Fehler	1	Die Variable "e" verbirgt eine Variable in einem einschließenden Block.

So sieht derzeit der if-Zweig aus:

Code:
        If Timer1.Enabled = False Then
            ProgressBar1.Value = 0
            Timer1.Start()

            'Versuch die DB zu verbinden
            Try
                Dim con As SqlConnection = New SqlConnection("Data Source=localhost;" & _
                                                             "Initial Catalog=pubs;Connect Timeout=10;" & _
                                                             "Trusted_Connection=yes")
                con.Open()
            Catch e As Exception
                ' Anweisungen
                e.Message.ToString("Fehler in der DB-Connection")
            End Try

Das Code-Segment ab dem Try-Catch stammt aus dem vb-openbook von Galileo.

Derzeit arbeite ich mit VB 2008 Express.

@Norbert Falls es mein Projekt stark vereinfacht, nehme ich gern deinen Rat an und bastele eine anim. Grafik. Kann ich diese, wenn die 10s um sind ebenfalls auf "visible=false" setzen?
 
Zuletzt bearbeitet:
Tausche e gegen ex, dann sollte es laufen.

Stark vereinfachen, weiß ich nicht, aber du ersparst dir etwas Unnötiges. Zudem würde eine derartige Grafik in einer PictureBox angezeigt werden, die natürlich auf visible=false gestellt werden kann.

Wenn die TextBoxen bei dir nach dem Start angezeigt werden, dann setzt du sie nicht früh genug auf nicht sichtbar. D.h. setze sie im Designer auf Visible = false, oder im Konstruktor der jeweiligen Form nach dem Aufruf von InitializeComponent.
 
Zurück