Automatyczna tabulacja textBox'ów.

Odpowiedz Nowy wątek
2015-01-18 00:18
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.

Pozostało 580 znaków

2015-01-18 13:13
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ć.

edytowany 1x, ostatnio: dam1an, 2015-01-18 14:00

Pozostało 580 znaków

2015-01-18 13:49
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";
}
Zasada DRY. - dam1an 2015-01-18 13:51

Pozostało 580 znaków

2015-01-18 14:27
Krwawy Lew
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.

Pozostało 580 znaków

2015-01-18 14:35
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.

edytowany 2x, ostatnio: dam1an, 2015-01-18 14:46

Pozostało 580 znaków

2015-01-18 14:49
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# :)

Pozostało 580 znaków

2015-01-18 15:18
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.

edytowany 2x, ostatnio: dam1an, 2015-01-18 15:24

Pozostało 580 znaków

2015-01-18 15:53
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 :)

Pozostało 580 znaków

2015-01-18 16:06
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.

Pozostało 580 znaków

2015-01-18 16:13
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ą.

Pozostało 580 znaków

2015-01-18 16:18

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.

edytowany 1x, ostatnio: dam1an, 2015-01-18 16:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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