Buttony i zmiana ich koloru w timerze

0

Witam, mam taki problem, chciałbym żeby jak kliknę np na button1 to button3 zmieni swój kolor itd czyli jak kliknę np button30 to kolor zmieni button32. Nie wiem jak się za to zabrać, mój nauczyciel powiedział bym zrobił to przy użyciu Timera, w sensie że co sekundę kolor zmieni się w kolejnym buttonie.

1

Do końca nie rozumiem, ale jeżeli chcesz aby kolor zmienił się w buttonie n+2 po kliknięciu buttona n, to podepnij jedno zdarzenie onClick dla wszystkich i szukaj albo po nazwie albo otaguj buttony i szukaj po tagach odpowiedniego buttona tj. o numerze n+2.

0
Marek12345 napisał(a)

Witam, mam taki problem, chciałbym żeby jak kliknę np na button1 to button3 zmieni swój kolor itd czyli jak kliknę np button30 to kolor zmieni button32.

Więc zrób tak, jak zasugerował Ci @xeo545x39 - jedno zdarzenie kliknięcia przypisz wszystkim przyciskom, a rozpoznanie numeru przycisku możesz zrobić przez sprawdzenie Tagu z sendera; To jest najkrótsza opcja;

Marek12345 napisał(a)

mój nauczyciel powiedział bym zrobił to przy użyciu Timera, w sensie że co sekundę kolor zmieni się w kolejnym buttonie.

No to albo po kliknięciu, albo w tajmerze - zdecyduj się; Jeśli po kliknięciu, to patrz wyżej; Jeśli co sekundę, to trzymaj numer przycisku w zmiennej, a w tajmerze co sekundę zmień kolor przycisku o numerze ze zmiennej i zwiększ ten numer (tylko sprawdź, czy numer wskazuje na ostatni przycisk i jeśli tak - wpisz numer pierwszego).

0

Do wszystkich buttonów trzeba ustawić zdarzenie OnClick na button1_Click, które przykładowo może wyglądać tak:

private void button1_Click(object sender, EventArgs e)
        {
            string NazwaButtona = (sender as Button).Name; //info jaki button został kliknięty
            int NumerButtona = Convert.ToInt32(NazwaButtona.Substring(NazwaButtona.Length - 1)); //numer buttona

            foreach (Control b in Controls)//sprawdzam wszystkie controlki na formie
            {
                if (b.Name == string.Format("button{0}", NumerButtona + 2)) 
                {
                    b.BackColor = Color.Yellow;
                }
            }
            
        }
0
public Form1()
{
    InitializeComponent();

    const int buttonsCount = 10;
    for (int i = 0; i < buttonsCount; i++)
    {
        string name = String.Format("button{0}", i); 
        Button button = new Button
            {
                Name = name,
                Text = name,
                Location = new Point(0, i*25),
                Size = new Size(200, 23),
            };

        // Target = nazwa buttona którego nazwę zmienimy.
        // Deklaracja target musi być poza anonimowy delegatym żeby "uwiązać" i.
        string target = String.Format("button{0}", (i + 2) % buttonsCount);

        button.Click += (sender, eventsArgs) =>
            {
                // Kliknięty przycisk na zielono.
                ((Button) sender).BackColor = Color.Green;
                // Target na żółto.
                this.Controls[target].BackColor = Color.Yellow;
            };

        this.Controls.Add(button);
    }
}

Tworzenie nazwy można przenieść do osobnej funkcji, żeby nie powtarzać kodu.

No i jeszcze wersja bez lambdy.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        const int buttonsCount = 10;

        for (int i = 0; i < buttonsCount; i++)
        {
            string name = CreateNameFromId(i);
            string target = CreateNameFromId((i + 2)%buttonsCount);

            var button = new Button
            {
                Name = name,
                Text = name,
                Location = new Point(0, i * 25),
                Size = new Size(200, 23),
                Tag = target,
            };

            button.Click += OnButtonClick;

            this.Controls.Add(button);
        }
    }

    private string CreateNameFromId(int id)
    {
        return String.Format("button{0}", id);
    }

    public void OnButtonClick(object sender, EventArgs eventArgs)
    {
        var clicked = (Button) sender;
        string target = (string)clicked.Tag;

        clicked.BackColor = Color.Green;
        this.Controls[target].BackColor = Color.Yellow;
    }
}

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