Hallo
ich bin Grad dabei, ein Loginformular zu Programmieren
Wenn kein Benutzername eingegeben wurde soll das Benutzername-Feld einen schwarzen Hintergrund bekommen und unbeschreibbar sein
Nach 2 Sekunden sollen diese Eigenschaften wieder aufgehoben werde.
Nun werden nur die Befehle nach
Thread.Sleep(2000);
Anbei mein Code ...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Data.Odbc;
using MySql.Data.MySqlClient;
namespace Erstes_Programm_mit_GUI
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
private void button_abbrechen_Click(object sender, EventArgs e)
{
close();
}
public void close()
{
this.Close();
}
void Button_einloggenClick(object sender, EventArgs e)
{
string mysql_daten = "UID=;" +
"PASSWORD=;" +
"SERVER=;" +
"DATABASE=;";
MySqlConnection connection = new MySqlConnection(mysql_daten);
connection.Open();
if (connection == null)
{
MessageBox.Show("Unable to connect to database server!");
}
else if (connection != null)
{
MessageBox.Show("Connection to database server was successfull!");
MySqlCommand checkifusernameisindb = new MySqlCommand("SELECT ID FROM benutzer WHERE benutzerName = '';", connection);
if (string.IsNullOrEmpty(benutzername.Text))
{
benutzername.BackColor = System.Drawing.Color.Black;
benutzername.Enabled = false;
Thread.Sleep(2000);
benutzername.Enabled = true;
benutzername.BackColor = System.Drawing.Color.Wheat;
benutzername.Text = "test";
}
}
}
}
}
Thread.Sleep verhindert das Ausführen eines vorherigen Befehls
Ist als Aussage vollkommen richtig und ist genau dafür da.
Schau Dir Timer an und überdenke Deinen Post noch mal, da taucht nicht mal eine Frage oder ähnliches auf.
Vielleicht löst du das besser mit einem Timer.
Ich glaube das Thread.Sleep() legt die ganze Oberfläche inklusive OnPaint() und den ganzen kram schlafen, so dass da gar nichts neu gezeichnet wird.
OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man statt
if (connection == null)
else if (connection != null)
eher
if (connection)
else if (!connection)
machen sollte, weil das sonst doppelt gemoppelt ist und somit sinnlos.
Gruß, Alf
Hallo Soulkiller1990,
dien Tipp von Knuddlbaer solltest du dir mal anschauen..
Aber zu deinem Problem:
Thread.Sleep(xxx) verhindert u.a. das Windows-Nachrichten richtig ausgewertet werden. Es gibt die große Keule
Application.DoEvents()
die zwingend alle vorhandenen Windows-Nachrichten weiterleitet / auswertet. Aber das sollte man vermeiden.
-> Daher lieber einen Timer einsetzen..
Viele Grüße,
moq
Hm die Fragestellung fehlt in der Tat
Also jetzt hab ich 2 Fragen :
1)Warum wird der Befehl vor dem Sleep nicht ausgeführt (von der Reihenfolge her müsster das ja erst machen und dann den Thread schlafen legen
2)Wie funktioniert das mit dem Timer? Gibs da irgendwo n Tutorial?
Beides findest Du entweder in der MSDN oder im Grundlagenbuch.
Thread.Sleep(xxx) verhindert u.a. das Windows-Nachrichten richtig ausgewertet werden. Es gibt die große Keule
Application.DoEvents()die zwingend alle vorhandenen Windows-Nachrichten weiterleitet / auswertet. Aber das sollte man vermeiden.
Bei einem Thread.Sleep im UI Thread wird Dir auch ein Application.DoEvents nicht helfen. Der Thread seht AFAIK mindestens so lange wie in Thread.Sleep angegeben. Er bekommt einfach keine Zeit zugewiesen etwas zu machen.
if (connection == null) else if (connection != null)eher
if (connection) else if (!connection)
Wo ist da jetzt der Unterschied ?
Vor dem Sleep und nach dem Sleep hilfts schon. 😉
Hallo zusammen,
generell siehe auch [FAQ] Warum blockiert mein GUI?
OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man[...]
Nein, das war in einem anderen Zusammenhang: [Tipp] Anfängerfehler == true / == false
Trotzdem ist der Vergleich auf null sinnlos, da connection nie null sein wird.
Schlägt die Verbindung fehl, sollte eine Exception auftreten.
Ebenfalls redunant wäre die Verwendung von else if, aber das ist zu vernachlässigen.
Nochmal, Thread.Sleep ist keine vernünftige Implementierung. Statt Thread.Sleep immer einen Timer verwenden. Für Gui empfielt beispielsweise System.Windows.Forms.Timer, für Business-Logik ein System.Threading.Timer.
2)Wie funktioniert das mit dem Timer? Gibs da irgendwo n Tutorial?
beispiele gibts meist auf der MSDN-Seite der jeweiligen Klasse.
Hallo Alf Ator,
OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man statt
if (connection == null) else if (connection != null)eher
if (connection) else if (!connection)machen sollte, weil das sonst doppelt gemoppelt ist und somit sinnlos.
das habe ich bestimmt noch nicht geschrieben 😃 Wenn wir mal voraussetzen, dass connection null sein könnte (was ja im Beispiel nicht der Fall ist), dann würde man einfach
if (connection == null) {
...
} else {
...
}
oder
if (connection == null) {
...
return;
}
...
schreiben. Eine doppelte Abfrage wäre in der Tat doppelt gemoppelt.
herbivore
... zudem würde der C# Compiler das Konstrukt gar nicht akzeptieren, da Connection nicht vom Typ bool ist.