Как бы вы закодировали множество кнопок в один метод? - PullRequest
1 голос
/ 15 декабря 2010

Я пытаюсь исправить компьютерную программу на C # для игры MasterMind. Прямо сейчас есть много ненужного кода для кнопок. Я знаю, что могу объединить их все в один метод, но не знаю как. Вот часть кода. Пожалуйста, помогите.

private void button1_Click(object sender, EventArgs e)
        {
            this.ActiveControl.BackColor = controlColor;
            this.ActiveControl.Text = controlNumber;
            allCellsClicked[0] = '1';
            if (all_Buttons_Clicked())
            {
                allCellsClicked[0] = '0';
                allCellsClicked[1] = '0';
                allCellsClicked[2] = '0';
                allCellsClicked[3] = '0';
                button04.Enabled = false;
                button03.Enabled = false;
                button02.Enabled = false;
                button01.Enabled = false;
                guess++;
                Label1.Text = "Guess Number " + Convert.ToString(guess);
                label4.Visible = true;
                label5.Visible = true;
                label4.Text = "0";
                label5.Text = "0";
int a = int.Parse(button01.Text), b = int.Parse(button02.Text), c = int.Parse(button03.Text), d = int.Parse(button04.Text);
int rightCol, rightPos;
                CheckAnswer(a, b, c, d, out rightPos, out rightCol);
                label4.Text = rightCol.ToString();
                label5.Text = rightPos.ToString();

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

Если вы говорите, что все кнопки выполняют по сути один и тот же код, но он копируется несколько раз, тогда вы можете посмотреть, где событие нажатия каждой кнопки подключено к каждому из их обработчиков событий, и указать все они по одному и тому же методу.

Где-то (вероятно, в вашем filename.Designer.cs) у вас есть что-то вроде этого:

button1.Click += new EventHandler(button1_click);

Чтобы изменить это, вы можете настроить каждый из них следующим образом (обратите внимание, что это не обязательно помещать в файл Designer.cs и что не рекомендуется редактировать этот файл вручную):

button1.Click += new EventHandler(button_click);
button2.Click += new EventHandler(button_click);
button3.Click += new EventHandler(button_click);
button4.Click += new EventHandler(button_click);
...

где у вас есть метод, определенный следующим образом:

private void button_Click(object sender, EventArgs e)
{
   // stuff that happens when a button is clicked
}

Это заставит все кнопки использовать один и тот же обработчик события button_click. Если вам нужно узнать, с какой кнопки произошло событие, вы можете проверить идентификатор отправителя:

Button buttonThatClicked = sender as Button;
if (buttonThatClicked != null)
{
   // do whatever you need to, based on the button's properties
}
2 голосов
/ 15 декабря 2010

Если у вас есть повторяющийся код в нескольких методах button_click, просто создайте отдельный метод и вызовите его у методов button_click.

private void button1_Click(object sender, EventArgs e)
        {
            this.ActiveControl.BackColor = controlColor;
            this.ActiveControl.Text = controlNumber;
            allCellsClicked[0] = '1';
            checkGuess();
        }

private void button2_Click(object sender, EventArgs e)
        {
            this.ActiveControl.BackColor = controlColor;
            this.ActiveControl.Text = controlNumber;
            allCellsClicked[0] = '2';
            checkGuess();
        }

private void checkGuess(){
       if (all_Buttons_Clicked())
            {
                allCellsClicked[0] = '0';
                allCellsClicked[1] = '0';
                allCellsClicked[2] = '0';
                allCellsClicked[3] = '0';
                button04.Enabled = false;
                button03.Enabled = false;
                button02.Enabled = false;
                .....
            }
0 голосов
/ 15 декабря 2010

Вы можете просто связать ту же функцию обратного вызова события Click с каждым событием Click кнопки.Вы можете сделать это через код или через панель свойств.Просто выберите каждую кнопку, а затем выберите один и тот же обработчик событий для каждой.

В вашем случае, если вы хотите, чтобы каждая кнопка использовала событие button1_Click, то свяжите это событие button1_Click с каждой кнопкой.Если вы сделаете это, вы можете переименовать функцию обратного вызова события в нечто более общее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...