Automatyczna tabulacja textBox'ów.

0

Witam.

Mam pewien problem. Załóżmy że mam 3 textBoxy i 3 buttony generujące wartości kolejno "1", "2", "3". Jak zrobić aby po wciśnięciu któregoś z przycisków w textBoxie pojawiała się wartość tego przycisku i... automatycznie kursor przeszedł do textBoxa nr 2, znów przycisk i znów textBox nr 3 i koniec...? Bardzo proszę o jakąś podpowiedź.

Pozdrawiam.

0
//najpierw generuje buttony i textboxy jeśli dodałeś je przez designer to musisz sam im przypisać Tag
for(int i = 0;i<3;i++)
{
    Button btn = new Button();
    btn.Clicked += ButtonClickedEventHander();
    TextBox tb = new Textbox();
    panel.Add(tb);
    panel.Add(btn);
    btn.Tag = Tuple.Create(tb,i);
}
//tak to robiesz jeśli masz już textboxy i buttony gotowe
button1.Tag = Tuple.Create(textBox1, 1);
button2.Tag = Tuple.Create(textBox2, 2);
button3.Tag = Tuple.Create(textBox3, 3);
//no i oczywiście każdy z buttonów otrzymuje ten sam event
//jeśli buttony nazywają się w sposób button1, button2.. to w zasadzie można by nawet kombinować z wyciąganiem cyferki z nazwy buttona


void ButtonClickedEventHandler(object sender, EventArgs args)
{
    var btn = sender as Button;
    var tuple = btn.Tag as Tuple<TextBox,int>;
    tuple.Item1.Text = tuple.Item2.ToString();
}

Pisane na kolanie, ale powinno działać.

0

Jeśli dobrze rozumiem, to masz jeszcze inne rozwiązanie

private void Form1_Activated(object sender, EventArgs e)
{
    textBox1.Focus();
}

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = "1";
    textBox2.Focus();
}

private void button2_Click(object sender, EventArgs e)
{
    textBox2.Text = "2";
    textBox3.Focus();
}

private void button3_Click(object sender, EventArgs e)
{
    textBox3.Text = "3";
}
0

kkarol: Dokładnie o takie coś mi chodzi tylko że nie mogę przyporządkować konkretnego buttona to textboxa (raz może być w tb1 wart. 1 albo 3...) ale po wpisaniu jej właśnie ma tab przeskoczyć na tb2.

0

Dobra nie doczytałem że ma jeszcze focus przeskakiwać. Co to znaczy że nie możesz przyporządkować buttona do textboxa?

        private void button1_Click(object sender, EventArgs e)
        {
            var btn = sender as Button;
            int number = int.Parse(btn.Name.Last().ToString());
            this.Controls["textBox" + number].Text = number.ToString();
            if(number<3)
            {
                number++;
                this.Controls["textBox" + number].Focus();
            }
        }

Tylko każdemu buttonowi przypisz ten sam event.

0

dam1an: To znaczy że nie mogę zrobić tak, że bt1 ustawia wart. "1" tylko w tb1. Do tb1 może trafić wart. od 1 do 3 w zależności który bt zostanie wciśnięty. Proszę troszkę o wyrozumiałość bo można powiedzieć że dopiero zaczynam zabawę z C# :)

1
        private void button1_Click(object sender, EventArgs e)
        {
            var btn = sender as Button;
            string number = btn.Name.Last().ToString();
            var textBoxes = this.Controls.OfType<TextBox>().OrderBy(t=> t.Name);//tą linijkę możesz przenieść gdzieś gdzie wykona się tylko raz
            foreach (var item in textBoxes)
            {
                if (item.Text == "")
                {
                    item.Text = number;
                    var nextTb = textBoxes.FirstOrDefault(t => t.Name.Contains(
                        (int.Parse(item.Name.Last().ToString())+1).ToString()
                        ));
                    if (nextTb != null)
                        nextTb.Focus();
                    break;

                }
            }
        }

I ten focus jest do czegoś potrzebny?
Bo ten kod działa tak że pobiera wyciąga listę textboxów forechuje po niej i jeśli textbox jest pusty to dopiero piszę coś w nim, i daje focus.

0

Ok, jak już się zagłębiamy to powiem może najlepiej do czego mi to potrzebne:) Chcę zrobić własną aplikację do darta. Mam przygotowanych 20 bt + kolejnych 40 jako pola x2 i x3. I ma to działać tak, że po trafieniu np. 15 naciskamy odpowiedni bt i w tb1 pojawia się jego wartość i fokus przeskakuje do kolejnego tb. Gdy wpiszemy punkty z 3 rzutów do 3 bt, klikamy dalej i następuje kolejka gracza nr 2 a pkt gracza 1 są obliczane Pola się zerują i od początku.

Teoretycznie mam wyobrażenie jak to zrobić tylko właśnie miałem problem z tymi tb i focusem no ale chyba jeszcze jeden problem który mi się teraz nasunął... w razie pomyłki, żeby była możliwość zaznaczenia danego tb i po prawidłowym kliknięciu na bt wartość się zmieni w tymże tb. Mam nadzieje że nie zamotałem jeszcze bardziej :)

0

Mój kod działa tak że foreachuje po kolekcji textboxów i pierwszemu napotkanemu textboxowi który jest pusty ustawia wartość buttona. Więc może po prostu wyczyść textboxa tam gdzie się pomyliłeś.

fokus przeskakuje do kolejnego tb

Ale właśnie o to mi chodzi po co ten focus ma przeskakiwać, chcesz tam coś wpisywać?
Bo jeśli chodzi o to że focus ma przeskakiwać tylko po to aby program wiedział który następny textbox ma wypełnić to jest to tylko kulą u nogi.

0

no w zasadzie to tak myślałem że foks musi przeskoczyć aby po wciśnięciu buttona została wpisana do niego wartość. Widzę jednak, że twoje rozwiązanie załatwia sprawę i przy okazji eliminuje problem z pomyłką.

1

Więc w takim wypadku kod można skrócić:

        private void button1_Click(object sender, EventArgs e)
        {
            var btn = sender as Button;
            string number = btn.Name.Last().ToString();
            var textBoxes = this.Controls.OfType<TextBox>().OrderBy(t=> t.Name);
            foreach (var item in textBoxes)
            {
                if (item.Text == "")
                {
                    item.Text = number;
                    break;
                }
            }
        }

Nie sprawdzałem tego ale tak mi się wydaje że ciężko takie coś byłoby zrobić z focusem ponieważ ten focus przeskakiwałby na button w momencie kliknięcia.
@corthell i jeszcze coś, nie wiem czy będziesz potrafił to naprawić ale ten kod się wywali jeśli buttonów będzie więcej niż 9.

0

Tak też zrobiłem :) i w sumie analizując Twój kod to w buttonach powyżej 9 to chyba nie zadziała, zgadza się? Wartość danego buttona pobierana jest z ost. znaku jego nazwy zgadza się? Zastanawiam się czy jako zm. number nie wpisać od razu wartości danego buttona bo np. na button10 to nie zadziała.

... :-)

0

Dokładnie.
A czy nie będziesz wypisywał wartości buttonów w właściwości Text buttona? Bo jeśli tak to pobierz ją stamtąd.

0

Nie, nie będę nic wpisywał. Samo się będzie wpisywało po kliknięciu buttona. W tym przypadku zastosowałem tb a nie np. labele ponieważ, gdyby doszło do pomyłkowego wciśnięcia będzie można zastąpić starą wartość nową. Gdy wszystkie tb będą już poprawnie uzupełnione wartościami rzutów to po click bt Dalej program pobierze sobie dane z tych tb, zamieni je na int i pooblicza sobie tam z nich różne rzeczy.

0

Więc skąd będziesz wiedział który button wcisnąć żeby wpisało np 15 punktów?

0

yy no ten który będzie miał nazwę 20 :) i tak każdy inny od 1 do 20

0

przepraszam... ten z nazwa 15 oczywiście :)

0

Nazwa to jest button.Name skąd będziesz widział Name w uruchomionym programie?

0

nie z button.Name tylko z button.Text (po prostu zamiast standardowego opisu button1 nazwie je kolejno 1, 2, 3... działa to razem z Twoim kodem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1