Metoda dodająca obsługę przycisków

0

Witam
Mam problem z dodaniem Metody obsługi do przycisków. Mianowicie zrobiłem metodę obsługującą wszystkie przyciski, jako parametry podaję zmienne. Następnie dodałem tą metodę do wszystkich przycisków. Problemem jest dodanie zmiennej do przycisków w metodzie. Wywala błąd. Ponieżej kod lepiej to zobrazuje.

 public void Przycisk(int i, int j, int b)
        {
            if (KtoryAktywny == 1)
            {
                Pole[i, j] = TypPola.tpKolo;
                button[b].Text = "O";          // w tym miejscu wywala mi błąd
                button[b].Enabled = false;      // w tym miejscu wywala mi błąd
                KtoryAktywny = 10;
                labelAktualnyRuch2.Text = "X";
                KtoryAktywny = 10;
            }
            else if (KtoryAktywny == 10)
            {
                Pole[i, j] = TypPola.tpKrzyzyk;
                button[b].Text = "X";    // w tym miejscu wywala mi błąd
                button[b].Enabled = false;    // w tym miejscu wywala mi błąd
                labelAktualnyRuch2.Text = "O";
                KtoryAktywny = 1;
            }
        }
//tu przykład tak wywołuję wszystkie przyciski
private void button1_Click(object sender, EventArgs e) //0,0
        {
            Przycisk(0,0,1);
        }

W zaznaczonych miejscach wywala mi błąd. Gdy dodam zwykłą zmienna o nazwie button to też są błędy, gdy dodam

 Button[] button = new Button[b];

to też nie działa.To mi zasugerowało środowisko. Program się odpala, nie ma błędów, ale po wciśnięciu dowolnego klawisza program się zawiesza. Jak to rozwiązać? Chodzi mi o dodanie zmiennej do button w metodzie.

0

No najpierw się dowiedz jaki "błąd" Ci wywala.

0

CS0103 The name 'button' does not exist in the current context kolko_i_krzyzyk

a jak dodam te

 Button[] button = new Button[b];

to nie ma błędu

0

Komunikat chyba jest jasny - próbujesz się odwołać do nieistniejącej zmiennej. Skąd miałby się wziąć ten button w metodzie Przycisk, nie zapomniałeś go tam czasem przekazać?

0

jak ją zadeklarować?
np.

 public void Przycisk()
{
    button[i].Text="tekst";
}

//w przycisku button4 odwołac sie do tej metody np.
Przycisk[i]; i jako parametr przekazać zmienna i=4

Zadziała mi to na pewno jak do każdego przycisku dodam oddzielnie kod z metody i wpisze button2.Text-"tekst"; itd ale nie o to chodzi w programowaniu by kod powielać. Jak się do tego odwołać bo już nie mam pomysłu.

0

Musisz ją jakoś przekazać do tej funkcji. Podałeś za mało kodu, żeby móc powiedzieć dokładnie.

0
 public void Przycisk(int b)
        {
             Button[] button = new Button[10];  //bez tego wywala błędy podkreśla button,
             //natomiast z tym nie ma błędu ale się zawiesza aplikacja
             //Przyciski mają nazwę button1 oraz button2
                button[b].Text = "O";
                button[b].Enabled = false;               
        }
        private void button1_Click(object sender, EventArgs e) 
        {
            Przycisk(1);
        }
        private void button2_Click(object sender, EventArgs e) 
        {
            Przycisk(2);
        }
        //zeby nie powielać kodu chcę mieć metodę dla wszystkich oraz wywołać ją przy każdym przycisku, 
        //jako parametr podając numer przycisku np. button1, button2 i mi nie działa 

Podaję kod, ten też nie działa. Chcę właśnie przekazać numer przycisku...

1

Funkcja obsługi przycisku w argumencie sender dostaje referencję do kontrolki, która ją wywołała. Możesz więc przypisać tę samą funkcję do wszystkich przycisków i zrobić:

        private void button_Click(object sender, EventArgs e) 
        {
            var btn = (Button)sender;
            btn.Text = "O";
            //itd
        }
0
 Button[] button = new Button[10];  //bez tego wywala błędy podkreśla button,
             //natomiast z tym nie ma błędu ale się zawiesza aplikacja
             //Przyciski mają nazwę button1 oraz button2
                button[b].Text = "O";
                button[b].Enabled = false;       

W pierwszej linijce tworzysz sobie nową tablicę przycisków, która po pierwsze nie zawiera żadnych elementów - ma tylko miejsce na 10 przycisków. Co więcej, ta tablica nie ma żadnego związku z przyciskami, które położyłeś sobie w designerze na powierzchni formatki. To jest po prostu zupełnie nowy obiekt.

W linijce, w której ustawiasz właściwość Text, błąd powinien być, konkretnie wyjątek NullReferenceException w trakcie działania programu. Skoro go nie masz, to znaczy, że uruchamiasz aplikacje bez debugera (ctrl + F5) zamiast z debugerem (po prostu F5).

0

a co gdy chcę mieć np 3 parametry do przekazania? I mieć np 10 przycisków a metodę mieć do obsługi np 6?

0

To przekaż trzy parametry, a metodę podepnij do sześciu przycisków.

0

Jak to sformułować względem tego kodu który dodałem? Bo jakoś tego nie widzę.

0

A nie możesz zrobić listy buttonów i przejechać po nich przypinając zdarzenia?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace App
{
    class Program
    {
        static void MyBestButtonMethod(int n)
        {
            MessageBox.Show(string.Format("{0}", n));
        }

        static void Main(string[] args)
        {
            var form = new Form();
            var btn1 = new Button();
            btn1.Text = "First";

            var btn2 = new Button();
            btn2.Text = "Second";

            var buttons = new List<Button>() { btn1, btn2 };
            buttons.ForEach(b => b.Click += (sender, e) => MyBestButtonMethod(buttons.IndexOf(b) + 1));

            var panel = new FlowLayoutPanel();
            form.Controls.Add(panel);
            panel.Controls.Add(btn1);
            panel.Controls.Add(btn2);

            form.ShowDialog();
        }
    }
}

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