Zum Inhalt springen

c# AutoTab?


Godfather_d

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Hahne
Link zu diesem Kommentar
Auf anderen Seiten teilen

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!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Godfather_d
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

post-25349-14430447978955_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen


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 von TDM
Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

fehlermeldungbh9.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Godfather_d
Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

JUUUUUUUHHHHHHHUUUU es klappttttt!!!! :):D

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...