Entwickler-Ecke
WinForms - Gibt es dazu eine komfortablere Lösung?
KingSP - Sa 21.11.15 12:35
Titel: Gibt es dazu eine komfortablere Lösung?
Heyho,
ja ich bins wieder, ich hatte vor kurzem erst einmal gefragt ob ein bestimmtes Programm in C# möglich ist.
Ich habe mich nach überlegen einmal dran gesetzt und bin eigentlich auch zufrieden. Nur werde ich das Gefühl nicht los das es doch komfortabler geht. Bevor ich anfange alles zu erklären ich werde 3 Screenshots anhängen um es euch zu veranschaulichen.
Im Screenshot 1 seht ihr das Programm im Rohzustand, euer Auge sollte sich auf die TextBox und die GroupBox namens "Details" richten. Diese steht auf Screenshot 1 noch auf 0 und in der TextBox steht nichts. In Screenshot 2 seht ihr was passiert wenn ich den Namen "Vayne" in die TextBox eingebe und meine eingabe mit der Enter-Taste bestätige.
Nun zu meiner Frage:
Ich hab das jetzt so geregelt das ich dafür eine IF Schleife benutzt habe und diese dann mit Else If erweitert habe, nun stellt sich für mich die Frage, kann man das nicht übersichtlicher Lösen? Ich habe mich durch Google schon durchgekämpft und das mit der Datenbank gefällt mir auch, nur möchte ich niht das man die Datenbank sieht sondern das es sich nur die Werte aus der Datenbank zieht, hat jemand dafür eine Lösung?
Mit freundlichen Grüßen
KingSP
Moderiert von
Th69: Topic aus C# - Die Sprache verschoben am Sa 21.11.2015 um 13:20
FinnO - Sa 21.11.15 13:04
Moin,
ja, du kannst das einfacher lösen und zwar mit objektorientierter Programmierung (OOP). Dazu musst du eine Klasse erstellen, die die Eigenschaften deiner
sog. Champs enthält.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public class Champ { public string Name { get; set; } public double Armor { get; set; } public Champ(string name) { Name = name; } } |
Objekte dieser Klasse kannst du dann in einer beliebigen Datenstruktur, z.B. einem
Dictionary [
https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx] verwalten:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var myChamps = new Dictionary<string, Champ>(); myChamps.Add("Dieter", new Champ("Dieter")); myChamps["Dieter"].Armor = 32.5; myLabel.Text = myChamps["Dieter"].Name; |
PS: Für weiter Fragen: Es hilft uns immer mehr, deinen Code zu sehen, als Screenshots von deiner Benutzeroberfläche.
Viel Spaß
Finn
KingSP - Sa 21.11.15 13:27
Hey danke für die schnelle Antwort und ich entschuldige mich schonmal wenn ich was Frage was sich selbst erklärt.
Ich hab versucht mal mein ganzes Projekt unten reinzuposten. Wo genau und wie muss ich das jetzt machen? Weil Ich wollte auf diese weise nicht nur 2 machen sondern ungefähr .. 128.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| namespace League_of_Legends_Helper { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void btn_Reset_Click(object sender, EventArgs e) { lbl_Health.Text = "0 - 0"; lbl_AD.Text = "0 - 0"; lbl_Range.Text = "0"; lbl_Armor.Text = "0 - 0"; lbl_MR.Text = "0 - 0"; lbl_MS.Text = "0"; }
private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne")) { lbl_Health.Text = "498 - 1909"; lbl_AD.Text = "53 - 109"; lbl_Range.Text = "550"; lbl_Armor.Text = "19 - 76.8"; lbl_MR.Text = "30"; lbl_MS.Text = "330"; } else if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Lucian") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("lucian")) { lbl_Health.Text = "554 - 1914"; lbl_AD.Text = "52 - 103"; lbl_Range.Text = "500"; lbl_Armor.Text = "24 - 75"; lbl_MR.Text = "30"; lbl_MS.Text = "335"; } }
private void btn_Flash_Click(object sender, EventArgs e) { } } |
Mit freundlichen Grüßen
KingSP
Moderiert von
Th69: Code- durch C#-Tags ersetzt
Ralf Jansen - Sa 21.11.15 13:35
| Zitat: |
| Wo genau und wie muss ich das jetzt machen? |
Wo - in einer neuen Klasse damit du die von überall aus einfach benutzen kannst.
Wie - z.B. so wie von Finno gezeigt. Wenn du das in einer neuen Klasse machst also eine Klasse die eine Liste deiner Champs veröffentlicht die du dann in deiner Anwendung an beliebiger Stelle nutzen kannst hast du die Chance später die Implementierung dieser Klasse zu ändern (z.b. du beginnst mit einen Dictionary mit in der Anwendung fest verdrahteten Werten stellst das dann aber später auf eine Datenbank um dann must du nur diese Klasse ändern und deine Anwendung wird ansonsten genauso einfach weiter funktionieren)
| Zitat: |
| Ich hab das jetzt so geregelt das ich dafür eine IF Schleife benutzt habe |
Über den Ausdruck solltest du nochmal nachdenken ;)
| Zitat: |
| das mit der Datenbank gefällt mir auch, nur möchte ich niht das man die Datenbank sieht |
Das mit dem nicht sehen verstehe ich nicht ganz. Meinst du das man kein Datenbank File im Dateisystem sehen können soll? Oder was meinst du genau?
Th69 - Sa 21.11.15 13:49
Statt einer Datenbank kannst du doch auch einfach eine Text- oder XML-Datei oder ähnliches nehmen.
Diese liest du dann in die Datenstruktur ein, z.B. das von Finn erwähnte
Dictionary<> und brauchst so nur den Code dafür in eine kleine Methode packen.
Die Textdatei sieht dann einfach so aus:
Quelltext
1: 2:
| Vayne, 498 - 1909, 53 - 109, 550, 19 - 76.8, 30, 330 Lucian, ... |
Das Einlesen kannst du dann entweder mit
File.ReadAllLines und
String.Split vornehmen oder du benutzt einen CSV-Parser, z.B.
A fast CSV-Reader [
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader].
Beim Programmieren sollte man immer Codeduplizierungen vermeiden und dann ist es das beste Daten und Code voneinander zu trennen.
Wenn dir das mit der Textdatei (noch) zu kompliziert erscheint (obwohl es das wirklich nicht ist ;- ), dann kannst du auch die Daten direkt im Programmcode anlegen (aber getrennt von den Methoden):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| class Data { public static readonly var Champs = new Dictionary<string, Champ>() { { "Vayne", new Champ("498 - 1909", "53 - 109", 550, "19 - 76.8", 30, 330) }, { "Lucian", new Champ(), }; } |
KingSP - Sa 21.11.15 14:40
Heyho,
kann mir vielleicht jemand die Möglichkeit von FinnO genauer erklären? Wie genau ich diese nun einbinden müsste um dann nur noch den Namen in die TextBox schreiben zu müssen?
Vielen lieben dank
Mit freundlichen Grüßen
KingSP
Th69 - Sa 21.11.15 16:53
So in etwa (anhand meines Beispiels):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Champ champ; if (Data.Champs.TryGetValue(txtBox_Champ.Text, out champ)) { lbl_Health.Text = champ.Health; lbl_AD.Text = champ.AD; lbl_Range.Text = champ.Range.ToString(); } |
Du mußt die Datenklasse
Champ dann entsprechend um die Eigenschaften erweitern.
Wenn du meinen Code (mit direkter Initialisierung) nutzen willst, dann benötigst du auch noch einen passenden Konstruktor, welcher die Parameter in die Eigenschaften speichert:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| class Champ { public Champ(string health, string ad, int range ) { Health = health; AD = ad; Range = range; }
public string Health { get; set; } } |
Du mußt bei den Eigenschaften dann schauen, welches der jeweils passende Datentyp dafür ist (wenn du nicht damit rechnen willst, dann kannst du natürlich überall
string für nehmen).
KingSP - Sa 21.11.15 18:51
Heyho..
kann mir einer sagen was ich falsch gemacht habe?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace League_of_Legends_Helper { public partial class Form1 : Form { public class Champ { public string Name { get; set; } public double Health { get; set; } public double AD { get; set; } public double Range { get; set; } public double Armor { get; set; } public double MR { get; set; } public double MS { get; set; }
public Champ(string name) { Name = name; } } public Form1() { InitializeComponent(); }
private void btn_Reset_Click(object sender, EventArgs e) { lbl_Health.Text = "0 - 0"; lbl_AD.Text = "0 - 0"; lbl_Range.Text = "0"; lbl_Armor.Text = "0 - 0"; lbl_MR.Text = "0 - 0"; lbl_MS.Text = "0"; }
private void textBox1_KeyDown(object sender, KeyEventArgs e) { var myChamps = new Dictionary<string, Champ>(); myChamps.Add("Lucian", new Champ("Lucian")); myChamps.Add("Vayne", new Champ("Vayne"));
if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne")) { lbl_Health.Text = "498 - 1909"; lbl_AD.Text = "53 - 109"; lbl_Range.Text = "550"; lbl_Armor.Text = "19 - 76.8"; lbl_MR.Text = "30"; lbl_MS.Text = "330"; } else if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Lucian") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("lucian")) { myChamps["Lucian"].Health = 400 - 1200; myChamps["Lucian"].AD = 53; myChamps["Lucian"].Range = 500; myChamps["Lucian"].Armor = 50; myChamps["Lucian"].MR = 82; myChamps["Lucian"].MS = 330;
lbl_Health.Text = myChamps["Lucian"].Health; } }
private void btn_Flash_Click(object sender, EventArgs e) { } } } |
Wenn ich das dann starten will kommt folgende Fehlemeldung:
CS0029 Der Typ "double" kann nicht implizit in "string" konvertiert werden.
Allerdings versteh ich kein Wort was die bei Google damit meinen.. Ich danke schonmal für Antworten!
Ralf Jansen - Sa 21.11.15 19:17
| Zitat: |
C#-Quelltext 1:
| if (e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("Vayne") || e.KeyCode == Keys.Enter & txtBox_Champ.Text.Contains("vayne")) | |
Das solltest du einfacher und richtiger ausdrücken. Contains heißt der Text in der TextBox muss das nur enthalten. Der Code würde also auch "vaynen" oder "dfjghlvaynesdkjhg" in der TextBox reagieren.
Möglicherweise hast du jetzt schon Champs deren Name Teil einer Namens eines anderen Champs sind. Das würde also in die Hose gehen.
Besser wäre z.B.
C#-Quelltext
1:
| if (e.KeyCode == Keys.Enter && txtBox_Champ.Text.Trim().ToLower() == "vayne") |
Jetzt reagiert das auf jeder Groß/Kleinschreibweise ignoriert Leerzeichen vor und dahinter und reagiert nur auf "vayne".
| Zitat: |
C#-Quelltext 1:
| lbl_Health.Text = myChamps["Lucian"].Health; | |
Health ist ein double in einer TextBox wird aber ein string angezeigt. Du musst also erst eine Typumwandlung vornehmen (den Typ konvertieren). In diesem einfachen Fall reicht erstmal ein
C#-Quelltext
1:
| lbl_Health.Text = myChamps["Lucian"].Health.ToString(); |
So wie du das Dictionary myChamps in der Methode textBox1_KeyDown benutzt ist das übrigens völlig sinnfrei. Es beginnt Sinn zu machen wenn du es globaler in einer anderen Klasse definierst.
Hole es zumindest aus der textBox1_KeyDown raus, definiere und befülle es woanders, so das du es ,z.B. in textBox1_KeyDown, wiederverwenden kannst.
KingSP - Sa 21.11.15 20:46
Hey,
erstmal vielen dank für deine Antwort sie war sehr hilfreich.
Ich bin noch komplett neu in C# deswegen entschuldige ich mich für solche Fehler einfach mal.
Aber kannst du mir erklären wie man das Dictionary in einer anderen Klasse definiere?
Weil ich habe gerade absolut keine Ahnung.. Und finde auch nichts hilfreiches bei Google.
Mfg
KingSP
Th69 - So 22.11.15 09:58
Mit welchem Buch lernst du denn C#? Du solltest dir ersteinmal die Grundlagen erarbeiten, bevor du so ein Projekt angehst (du scheinst ja meinen Code nicht verstanden zu haben, sonst würdest du ihn ja benutzen).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!