C# / Windows Forms: Ein if statement und zwei conditions?
Ich habe zwei if statements gebaut: Einmal für das Passwort und einmal für den Nutzername. Wenn ich den else-Befehl ausführe, startet das Programm trotz falschem Passwort aber korrektem Nutzername.
Beides muss passen, um eingeloggt zu werden und nicht eins.^^
if (textBox1.Text == "Username hier platzieren")
{
this.Hide();
Form2 f1 = new Form2();
f1.ShowDialog();
this.Close();
}
if (textBox2.Text == "Passwort hier platzieren")
{
this.Hide();
Form2 f1 = new Form2();
f1.ShowDialog();
this.Close();
}
Wie ihr seht ist das sehr umständlich gebaut.^^
Ich möchte es in etwa so haben:
if (textBox1.Text == "Username hier platzieren") (textBox2.Text == "Passwort hier platzieren")
{
this.Hide();
Form2 f1 = new Form2();
f1.ShowDialog();
this.Close();
}
else
{
textBox1.Hide();
textBox2.Hide();
label1.Hide();
label2.Hide();
button1.Hide();
label3.Show();
label4.Show();
label5.Show();
Width = 414;
Height = 155;
Leider klappt diese Methode nicht, weil ich anscheinend irgendetwas vergessen habe, um das if statement zu erweitern. Nur weiß ich nicht was.
Dieses Login-System ist nichts Wildes. Ich bin nur ein bisschen am Üben, wie alles so im Thema Programmierung funktioniert.
7 Antworten
if (textBox1.Text == "Username hier platzieren")
{
this.Hide();
Form2 f1 = new Form2();
f1.ShowDialog();
this.Close();
}
if (textBox2.Text == "Passwort hier platzieren")
{
this.Hide();
Form2 f1 = new Form2();
f1.ShowDialog();
this.Close();
}
Wenn du dir die erste if anschaust machst du folgendes:
if (textBox1.Text == "Username hier platzieren")
Du frägst hier ab ob in der Textbox "Username hier platzieren" steht.
du musst eine Variable erstellen die abgefragt wird beispiel:
string admin = "Norbert";
Danach kannst du eine if - abfrage machen:
if(textBox1.Text == admin)
{
}
Du brauchst als Verknüpfung das logische AND (UND).
(Vergleich 1) && (Vergleich 2)
Sorry, aber deinen Code zu lesen, macht keinen Spaß :P
Ich persönlich würde die Aufgabe in etwa so lösen:
var hasValidLoginData = textBox1.Text == "cool username"
&& textBox2.Text == "cool password";
if (hasValidLoginData)
{
// Hier kommt, was auch immer nach dem Login kommen soll
ShowMyProgram();
}
else
{
// Wenn eins von Beidem falsch ist
ShowLoginErrorMessage();
}
Man muss das nicht in eine Variable packen, aber ich versuche immer zu lange IF-Bedingen zu vermeiden und vergebe dann lieber leicht verständliche Variablen-Namen, das kommt der Lesbarkeit zugute.
Ach ja:
Vergib immer sprechende Namen!
Ich weiß, dass WinForms die Controls automatisch so benennt, aber glaub mir: Überleg dir vorher gute Namen, denn sonst verlierst Du schnell den Überblick. Du kannst die Namen in den Eigenschaften ändern.
In der professionellen Softwareentwicklung wird das als Grundvoraussetzung betrachtet und wer keine gute Namen vergibt und sich nicht an die Guideline hält, bekommt auf die Finger :D
Erfahrene Entwickler wissen einfach, dass dieser kleine Zusatz-Aufwand sich hinterher doppelt und dreifach rentiert.
Und nein, auch ein Übungsprojekt ist da keine Ausnahme, das muss in Fleisch und Blut übergehen :D
Ich kann da nur folgendes kostenlose PDF-Buch empfehlen:
http://openbook.rheinwerk-verlag.de/visual_csharp_2012/
Es ist nicht ganz aktuell, seit 2012 hat sich schon so einiges getan, aber die Grundlagen sind natürlich immer noch gleich geblieben.
Alles Neue kann man sich nachträglich aneignen, Microsoft bietet da eine sehr gute MSDN-Doku, allerdings halte ich die für nicht so gut geeignet für Anfänger.
Und der Rat wegen der Benennung hat nichts mit der Sprache an sich zu tun ;)
Das sollte man überall machen, ob es nun die Programmierung ist, irgendwelche Ordner, Kabel hinter dem Schreibtisch, etc.
Du machst irgendetwas, weißt, was Du da tust und verlässt dich darauf, dass Du dich später daran erinnerst, aber das ist so gut wie nie so.
Du meinst //Diese Funktion ist für xy? ^^
Schau meist Videos auf Youtube an wegen dem Thema:, schau seine Videoreihe ganz gerne, da hab ich schon einiges rausfinden können, zb strings, arrays etc
Was meinst Du mit deinem ersten Satz?
Und wegen der Videoreihe, ich hab mir das verlinkte Video angeguckt und da muss ich dich enttäuschen.
Sein Video scheint darauf abzuzielen, die Leute zu motivieren (scheint ja auch zu funktionieren), allerdings verharmlost er das Thema dabei sehr.
Was er schreibt, stellt die Komplexität kleiner dar als sie eigentlich ist und lässt den größten Elefanten im Raum (Framework) Mal eben so unter den Tisch fallen, als wäre es eine Kleinigkeit.
Du hast nach den genannten Punkten das aller mindeste Minimum drauf, mit dem Du wenigstens ein kleines bisschen kapierst, was in einem kleinen Programm passiert, aber danach kommt noch so viel mehr.
Ich würde die genannten Punkte eher als das Grundlagen sehen, ab dem Du das erste Mal sinnvolle kleine Projekte starten kannst, und auch verstehst, was da passiert.
Schau dir das von mir verlinkte Buch an. Dir wird vermutlich einiges bekannt vorkommen, aber es geht sehr viel weiter ins Detail und zeigt auch vieles aus den Frameworks.
Wenn Du das durch hast, DANN hast Du die Grundlagen drauf ;) Da lernst Du, wie Du eine komplette Anwendung baust, mit allem, was eine übliche Anwendung so braucht: die meisten Grundlagen mit VisualStudio, Debuggung, Objektorientierung, Datenbanken mit ADO.NET und/oder EntityFramework (SQL-Kenntnisse vorausgesetzt), Text basierte Datenformate, Komplexe Benutzeroberflächen mit WPF, etc.
PS:
Seine Aussage, dass es für C# nur das .NET-Framework gibt, ist falsch:
- .NET Framework (das meinte er, ist an Windows gebunden, wird noch gepflegt, aber ab .NET 5 nicht mehr aktiv weiterentwickelt)
- .NET Core (plattformunabhängig, wird vermutlich dieses oder nächstes Jahr in .NET 5 umbenannt)
- Mono (plattformunabhängig, mittlerweile uninteressant, wurde von Microsoft gekauft und heute nimmt .NET Core den Platz von Mono ein)
- Silverlight (nutzt keiner mehr, war der Versuch, JavaScript im Browser-Markt Konkurrenz zu machen)
- UWP (ein angepasstes Framework für Windows-Handys)
- Xamarin (auch von Microsoft gekauft, allgemein für Handys, Android, Windows, iOS)
- Unity (für Spiele)
- .NET Standard (kein eigenes Framework, sondern sozusagen die Definition von Frameworks, siehe hier)
Und dann gibt's noch massig NuGet-Pakete, die mehr oder weniger große Erweiterungen bieten, die Du nutzen kannst. Über manche davon kann man auch nochmal Bücher schreiben, z.B. CSLA, das Ding ist ein Monster O.O
Aktuell am Wichtigsten dürften .NET Standard und .NET Core sein, fast alles Neues wird damit aufgebaut - oder sollte es zumindest.
Zum Lernen muss man das aber nicht nutzen, da reicht auch das alte .NET Framework aus und ist vermutlich etwas leichter, rein zu finden.
Was ein riesen text :O
Das Video welches ich gepostet habe war nur ein beispiel --> https://www.youtube.com/watch?v=f2VfGAzFLjs da fängt die Reihe quasi an.
Das ich nicht viel weiß vom Thema ist klar ^^
vor nem Jahr angefangen und 'nen Monat probiert, dann aufgegeben, nach knapp 3 Tagen fange ich wieder an, mich lässt das Thema iwie ned los :P
Also fürn Anfänger macht mich solch ein kleines Programm schon stolz ^^ auch wenn es funktionstechnisch eher semi gehalten ist --> https://www.youtube.com/watch?v=ekedg517MW8&feature=youtu.be
Also jetzt mit SQL Datenbanken anzufangen halte ich dann doch für keine gute Idee, zumal ich die Syntax noch nicht verinnerlicht habe, möchte ja Plan haben von dem was ich mache & nicht wie 'nen Script Kiddy Copy paste betreiben & drauf hoffen das es funktioniert.
Ja, es hat funktioniert mich zu motivieren, warum auch nicht?
Am PC sitzen, Programme schreiben, wenns klappt sich wie ein kleines Kind freuen macht doch laune + es hat den Vorteil, wenn ich später ein Studium in der Richtung machen "sollte" habe ich die Grundlagen schon drauf.
Auch wenn er Käse erzählt hat, ich hab ein neues Hobby entdeckt :P
EDIT: Ich habe die nun in Namen eingepackt, falls du das zweite Video gesehen haben solltest ;) Anfang ist gemacht ^^
Mich stört dabei auch eher, wie sehr er es verharmlost ^^
Man denkt, dass man was kann und wenn einem dann klar wird, was da noch kommt, klappt halt die Kinnlade runter :D
Aber vielleicht funktioniert bei mir diese Art Motivation auch einfach nicht.
Und wegen Datenbanken:
Das Buch baut dich ja Stück für Stück darauf vor, Datenbanken sind die letzten Kapitel, davor erst WPF und davor sind die eigentlichen C#-Grundlagen
Die SQL-Grundlagen kannst Du dir vorher ja aneignen, da müssen das aber auch keine umfassenden Grundlagen sein, nur simple Abfragetechniken, dass Du sie verstehst und grob weißt, was wie es arbeitet. Am Ende übernimmt EntityFramework die ganze Arbeit.
Für später: EntityFrameworkCore ist der Nachfolger und mMn. in sehr vielen Punkten deutlich besser. Der Umstieg ist aber nicht so schwer und es gibt eine tolle Tutorial-Seite, die beide Frameworks gut erklärt.
Bei dem Buch:
Pro Kapitel, schau dir die Beispiele an, verstehe sie, spiel damit rum, verstehe das Ergebnis und bau es am Ende mit was Eigenem neu. Gerade das herum spielen und verstehen, warum es das tut, was es tut (oder auch nicht), ist das Wichtigste.
Wenn Du dann der Meinung bist, es wirklich kapiert zu haben, dann geh zum nächsten Kapitel und dann bist Du auch weit genug, um die großen späteren Themen zu lernen.
Ein solches Buch ist kein Tutorial, sondern ein Buch, das man laaange durcharbeiten muss, es lehrt dich nicht, es begleitet dich.
==============
Der Fehler im Video:
Die Timer-Methode sollte vorher prüfen, ob die Zähler-Variable unter 0 ist oder nicht. Wenn ja: Tu was, wenn nein: zähl weiter runter.
Der "richtige" Weg wäre aber die "Task.Delay(10000)"-Methode, allerdings ist das ein ziemlich komplexes "Magic"-Feature, das seine Zeit zum Verstehen braucht. Auf der Anderen Seite macht es deinen Code soo viel einfacher :D
Behalte das Mal im Hinterkopf, irgendwann stößt Du wieder darauf, dann kannst Du nachlesen. Vorher macht das keinen Sinn, da Du dabei wirklich böse Fehler (Google Mal "Deadlock") machen kannst.
Du kannst in einer If-Anweisung mehrere Bedingungen verknüpfen. In deinem Fall brauchst du eine Und-Verknüpfung. In C# wird das mit zwei "&" gemacht. Also:
if (passwort.Text == "password" && username.Text == "username")
{
DoLogin();
}
Ich glaube, in deinem Code wurde einiges verschluckt und verrückt. Ich versuche, das gleich ein bisschen hübscher zu machen.
Fehlt dir die logische Verknüpfung? Du musst die Bedingungen && verknüpfen oder du schachtelst das if.
Abfragestruktur:
if(UserOK && PasswortOK)
{
...
}
// oder
if(UserOK)
{
if(PasswortOK)
{
...
}
}
Letztere Variante hat den Vorteil, dass du gezielt den User darauf hinweisen kannst, ob es am Usernamen oder am Passwort hapert.
Ja, mir fiel es genau so schwer zu lesen. Deshalb meine recht simple Version für Einsteiger, weil ich nicht weiß, ob Anfänger einen Bool direkt in der Abfrage ohne anderes verstehen. :-)
Ja, die Zeile die ich hier gepostet habe, sind durch den Quelltext übelst verschoben worden...Habe es geändert, die Zeilen rausgelöscht und stattdessen ein Bild eingefügt, jetzt muss es Frage.Net nur noch aktualisieren ^^
Uff, bin noch ein kompletter Neuling was Programmierung angeht, muss mich in die Syntax erstmal reinfuchsen ^^ Werde es aber mal testen, danke :)