Godfather_d Geschrieben 22. Juni 2008 Geschrieben 22. Juni 2008 Hallo Leute, habe zwei TextBoxen 1-2 mit der max. Länge von zwei Zeichen und jetzt möchte ich, wenn die TextBox 1 die max. Länge erreicht, automatisch auf die TextBox2 springt. Wie geht das? public Form1() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } } } Danke im Voraus! Zitieren
Hahne Geschrieben 22. Juni 2008 Geschrieben 22. Juni 2008 (bearbeitet) Das müsstest du eigentlich mit einer einfachen IF-Abfrage realisieren können. Mit den Events TextChanged hast du schon richtig angefangen. Ich würde es dann so schreiben, dass du für dein TextBox1 Control dieses Event anlegst: private void textBox1_TextChanged(object sender, EventArgs e) { } und dann fügst du dort die IF-Abfrage ein die testet wieviel Zeichen in der Textbox enthalten sind. Wenn du eine Zeichenlänge von 2 Zeichen erreicht hast wird automatisch die TextBox2 selektiert: if(TextBox1.Text.Lenght == 2) { TextBox2.Focus(); } So sollte es eigentlich klappen! Aber gleichzeitig würde ich noch eine Überprüfung mit einbauen die testet ob mehr als 2 Zeichen eingegeben worden sind. Es kann ja sein das jemand ein Wort in seiner Kopierablage hat und das einfügt. Würde ich aber auch mit einer IF-Abfrage machen... if(TextBox1.Text.Lenght > 2) { lblError.Text = "Bitte nur 2 Zeichen eingeben!"; TextBox1.Text = null; } lblError ist dabei nur ein einfaches Labelcontrol und wenn die TextBox1 mehr als 2 Zeichen hat wird die das Label mit einer Fehlermeldung ausgegeben und die TextBox1 wieder auf Null gesetzt. Gruß Hahne Bearbeitet 22. Juni 2008 von Hahne Zitieren
Godfather_d Geschrieben 22. Juni 2008 Autor Geschrieben 22. Juni 2008 OK THX, ich veruchs mal gleich. Zitieren
Godfather_d Geschrieben 22. Juni 2008 Autor Geschrieben 22. Juni 2008 Es hat alles geklappt!! Leider funktioniert es nicht so wie ich mir das vorgestellt habe. Wenn ich jetzt per Hand eintippe springt er von einer Box auf die andere, aber wenn ich 4 Zeichen kopiere und einfüge, springt er nicht in die zweite Box. Wie kriege ich das hin? :confused: Aber erstmal Danke für die vorige Lösung!! Zitieren
Hahne Geschrieben 22. Juni 2008 Geschrieben 22. Juni 2008 du meintest doch, dass nur 2 zeichen maximal zugelassen werden sollen oder nicht??? wenn das nich der fall is musst du die fehlerprüfung mit dem größer zwei entfernen Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 du meintest doch, dass nur 2 zeichen maximal zugelassen werden sollen oder nicht??? wenn das nich der fall is musst du die fehlerprüfung mit dem größer zwei entfernen Nein nein, dass ist schon richtig mit zwei Zeichen!! Ich habe zwei Boxen in jede Box dürfen nur zwei Zeichen rein. Ich möchte wenn ich z.B. den Text: ABCD habe, kopieren und einfügen können. Leider geht das jetzt nicht, nur wenn ich per Hand ABCD tippe, kopieren (copy) und einfügen (paste) geht nicht. Er bleibt dann bei der ersten Box hängen mit AB. Hast du vielleicht ne Idee wie man das machen könnte? Zitieren
Klotzkopp Geschrieben 23. Juni 2008 Geschrieben 23. Juni 2008 Leider geht das jetzt nicht, nur wenn ich per Hand ABCD tippe, kopieren (copy) und einfügen (paste) geht nicht. Er bleibt dann bei der ersten Box hängen mit AB.Ja, so sah deine Anforderung bisher auch aus. Du willst also nicht nur, dass dein Programm die Eingabe auf 2 Zeichen beschränkt, sondern auch alles, was über 2 Zeichen hinausgeht, in das nächste Textfeld verschiebt? Zitieren
TDM Geschrieben 23. Juni 2008 Geschrieben 23. Juni 2008 substring von 0 bis 1 in txt1 und von 2 (bis Ende) in txt2. :floet: Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 (bearbeitet) Ja, so sah deine Anforderung bisher auch aus. Du willst also nicht nur, dass dein Programm die Eingabe auf 2 Zeichen beschränkt, sondern auch alles, was über 2 Zeichen hinausgeht, in das nächste Textfeld verschiebt? Genau! Am besten noch das er alle Leerzeichen ignoriert. substring von 0 bis 1 in txt1 und von 2 (bis Ende) in txt2. :floet: Wie sieht die Syntax genau aus? Bearbeitet 23. Juni 2008 von Godfather_d Zitieren
Hahne Geschrieben 23. Juni 2008 Geschrieben 23. Juni 2008 Wie sieht die Syntax genau aus? Also ich habe das jetzt so verstanden, dass wenn du über Strg + V eine Zeichenfolge einfügst (Bsp. ABCDEFG) aber nur die ersten beiden Zeichen (AB) in der Textbox1 und den Rest (CDEFG) in Textbox2 haben willst würde ich das so lösen, dass du folgenden Code durch deine Fehlerbehandlung ersetzt: TextBox2.Text = TextBox1.Text.SubString(2); SubString bedeutet hier nichts anderes als das du den gesamten String aus der Textbox1 erst ab der Stringstelle 3 liest. Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 Also ich habe das jetzt so verstanden, dass wenn du über Strg + V eine Zeichenfolge einfügst (Bsp. ABCDEFG) aber nur die ersten beiden Zeichen (AB) in der Textbox1 und den Rest (CDEFG) in Textbox2 haben willst würde ich das so lösen, dass du folgenden Code durch deine Fehlerbehandlung ersetzt: TextBox2.Text = TextBox1.Text.SubString(2); Fast, ich möchte nach Strg + V die Zeichenfolge ABCDEFG, dass die Box1 "AB" drinne hat und Box2 "CD" und so weiter. Das soll ungefähr wie eine Key Eingabe bei spielen werden. Siehe: Zitieren
TDM Geschrieben 23. Juni 2008 Geschrieben 23. Juni 2008 (bearbeitet) TextBox2.Text = TextBox1.Text.SubString(2); SubString bedeutet hier nichts anderes als das du den gesamten String aus der Textbox1 erst ab der Stringstelle 3 liest. Richtig, der Vollständigkeithalber sollte es aber so aussehen: TextBox2.Text = TextBox1.Text.SubString(2); TextBox1.Text = TextBox1.Text.Substring(0,1); Fast, ich möchte nach Strg + V die Zeichenfolge ABCDEFG, dass die Box1 "AB" drinne hat und Box2 "CD" und so weiter. ok, dann hab ichs falsch verstanden. Dachte du hast nur zwei Textboxen. Dann zähl doch einfach hoch, mach ein array über alle Textboxen und iteriere: TextBox[] txtArray; string serial; //beide irgendwie füllen for(int i = 0, j = 0; i < txtArray.Length; i++) { txtArray[i].Text = serial.substring(j, j+1); j+=2; } So oder so ähnlich, vgl mit: http://forum.fachinformatiker.de/java/117387-string-splitten.html (Ist zwar java, aber die Idee hilft vielleicht.) Bearbeitet 23. Juni 2008 von TDM Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 ok, dann hab ichs falsch verstanden. Dachte du hast nur zwei Textboxen. Dann zähl doch einfach hoch, mach ein array über alle Textboxen und iteriere: TextBox[] txtArray; string serial; //beide irgendwie füllen for(int i = 0, j = 0; i < txtArray.Length; i++) { txtArray[i].Text = serial.substring(j, j+1); j+=2; } So das dachte ich mir auch schon, dass ich wahrscheinlich mit Arrays arbeiten muss, jedoch komme ich leider mit Arrays nicht so gut klar. :upps Fangen wir mal ganz langsam an mit zwei Boxen: private void textBox1_TextChanged(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } Ich wollte auch das alle Leerzeichen ignoriert werden, habe was von »Trim« gelesen. [B]TextBox[] txtArray; string serial; int[] store = {0, 1, 2, 3, 4, 16}; //beide irgendwie füllen for(int i = 0, j = 0; i < txtArray.Length; i++) {[/B] private void textBox1_TextChanged(object sender, EventArgs e) { if (textBox1.Text.Length == 2) { [B]txtArray[i].Text = serial.substring(j, j+1); j+=2;[/B] textBox2.Focus(); } private void textBox2_TextChanged(object sender, EventArgs e) { } [B]}[/B] Irgendwie hab ich keine ahnung wie ich das machen soll :confused: Zitieren
TDM Geschrieben 23. Juni 2008 Geschrieben 23. Juni 2008 Ich hab grad mal nen kleines Beispiel geschrieben, anstatt von Textboxen nehm ich aber nur Stringarrays (kommt am ende aufs selbe raus): static void Main(string[] args) { string[] serialParts = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialParts[a] = part; } for (int i = 0; i < serialParts.Length; i++) { Console.WriteLine("Part({0}): {1}", i, serialParts[i]); } Console.Read(); } Anmerkung: Die Funktion trim ersetzt nur Leerzeichen am Anfang und am Ende, deswegen hier Replace (es sei denn leerzeichen gehören zum serial). Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 Ich hab grad mal nen kleines Beispiel geschrieben, anstatt von Textboxen nehm ich aber nur Stringarrays (kommt am ende aufs selbe raus): static void Main(string[] args) { string[] serialParts = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialParts[a] = part; } for (int i = 0; i < serialParts.Length; i++) { Console.WriteLine("Part({0}): {1}", i, serialParts[i]); } Console.Read(); } Anmerkung: Die Funktion trim ersetzt nur Leerzeichen am Anfang und am Ende, deswegen hier Replace (es sei denn leerzeichen gehören zum serial). OK erstmal ein FETTES DANKE!!!!! Ich versuche es mal einzusetzen, mal gucken ob es klappt. Zitieren
Godfather_d Geschrieben 23. Juni 2008 Autor Geschrieben 23. Juni 2008 Hm, ich habs versucht leider weiß ich nicht genau an welcher Stelle der Quellcode hin muss? Und was ich genau verändern bzw. anpassen soll? Muss nur noch das hinbekommen, dann bin ich fertig mit meinem Programm. :cool: Zitieren
Godfather_d Geschrieben 24. Juni 2008 Autor Geschrieben 24. Juni 2008 In die Textchangemethode muss das. Alleine wenn ich das so reinstelle bekomme ich ne Fehlermeldung: private void Box1_TextChanged(object sender, EventArgs e) { [B] static void Main(string[] args) { string[] serialParts = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialParts[a] = part; } for (int i = 0; i < serialParts.Length; i++) { Console.WriteLine("Part({0}): {1}", i, serialParts[i]); } Console.Read(); }[/B] } Und mein Debugger sagt das hier: Zitieren
TDM Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 erm... lass mich raten - du programmierst noch nicht lange c#?! private void Box1_TextChanged(object sender, EventArgs e) { string[] serialParts = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialParts[a] = part; } } So müsste das aussehen, musst du natürlich noch anpassen, damit es in die Checkboxen eingetragen wird... Zitieren
Godfather_d Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 Ja das stimmt, habe leider nicht sehr viel ahnung davon. Ich muss doch jetzt nur noch überall wo serial steht meine Textbox Eintragen? string[] serialParts = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialParts[a] = part; } so keine Fehlermeldung. Danke! Jetzt stell sich mir die Frage wo ich meine TextBox1 bis 16 Eintragen muss? Wieso wird hier was hardcodiert?: string serial = "abc def2335"; Soweit ich das sehe muss ich doch bei Serial die TextBoxen Eintragen? Da die Serial ja hochgezählt wird oder? serial.ToString(); Textbox[1-16].ToString(); Wenn ich die TextBox Eintrage, muss ich sie TextBox oder TextBox.Text Eintragen? P.S. Danke für deine mühe mir zu helfen!!!! :uli Zitieren
TDM Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 serial war nur im Beispiel, damit ich eine Seriennummer hab. Die Textboxen entsprechen serialParts. Natürlich muss du bedenken, dass, wenn du eine Seriennummer eingibst, unterschieden werden muss, zwischen manueller eingabe und copy&paste. Das beispiel von mir ist nur, wenn du eine Seriennummer reinkopierst, eine einfache eingabe wird dadurch nicht behandelt. Zitieren
Godfather_d Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 (bearbeitet) Erstmal würd ich sagen, versuch ich die Copy/Paste Variante zum laufen zu bringen und dann versuch ich die zwei Parts zu mixen. Also ich hab das jetzt gemacht: private void Box1_TextChanged(object sender, EventArgs e) { [B] string[] [COLOR="Red"]Box[/COLOR] = new string[5]; string serial = "abc def2335"; serial = serial.Replace(" ", ""); for (int i = 0, a = 0; i < Box.Length; i += 2, a++) { string part = string.Empty; if (i + 1 < Box.Length) part = Box.Substring(i, 2); else part = Box[i].ToString(); [COLOR="Red"]Box[/COLOR][a] = part; }[/B] } Bekomme keine Fehlermeldung, jedoch funktioniert es noch nicht? Oder: private void Box1_TextChanged(object sender, EventArgs e) { [B] string[] [COLOR="Red"]Box[/COLOR] = new string[5]; Box = Box.Replace(" ", ""); for (int i = 0, a = 0; i < serial.Length; i += 2, a++) { [COLOR="Red"]Box[/COLOR] = string.Empty; if (i + 1 < Box.Length) part = Box.Substring(i, 2); else part = Box[i].ToString(); [COLOR="Red"]Box[/COLOR][a] = part; }[/B] } Bearbeitet 25. Juni 2008 von Godfather_d Zitieren
TDM Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 Also... Ich habs mal mit oberfläche gemacht und einfach paar Textboxen eingefügt. Im Konstruktor merk ich mir alle Textboxen und geh die später durch. public partial class Form1 : Form { public List<TextBox> serialTextBoxes = new List<TextBox>(); public Form1() { InitializeComponent(); foreach (TextBox txt in this.Controls) { serialTextBoxes.Add(txt); } } private void textBox1_TextChanged(object sender, EventArgs e) { TextBox txt = sender as TextBox; if (txt == null) return; string serial = txt.Text; if (serial.Length <= 2) return; serial = serial.Replace(" ", ""); for (int i = 0, a = serialTextBoxes.Count - 1; i < serial.Length && a >= 0; i += 2, a--) { string part = string.Empty; if (i + 1 < serial.Length) part = serial.Substring(i, 2); else part = serial[i].ToString(); serialTextBoxes[a].Text = part; } } } So, den Rest darfst du erstmal allein machen. Zitieren
Godfather_d Geschrieben 25. Juni 2008 Autor Geschrieben 25. Juni 2008 JUUUUUUUHHHHHHHUUUU es klappttttt!!!! DANKE DANKE DANKE!!!!!!!!!! :uli :bimei :uli :bimei Aber andererseits bin ich nicht so froh, da ich das nicht gemacht habe bzw. noch schlimmer ich den Quellcode zu 80% nicht verstehe. Ich versuch mal den Code dann in einzelteile zu zerlegen und poste sie dann hier, kannst du sie mir dann erklären? Zitieren
TDM Geschrieben 25. Juni 2008 Geschrieben 25. Juni 2008 D.h. du hast es einfach nur abgetippt und weißt nicht, was da passiert? Das ist aber nicht von praktischem Nutzen. Du solltest lieber noch etwas die Sprache (bzw. Programmieren allgemein) lernen. Eine gute Referenz ist z.B.: C# - Galileo OpenBook Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.