2013-02-24 5 views
0

OK допустим у нас есть кнопки, расположенные в следующем виде 5х5C# - изменить смежный цвет кнопки при нажатии

[11] [12] [13] [14] [15] 
[21] [22] [23] [24] [25] 
[31] [32] [33] [34] [35] 
[41] [42] [43] [44] [45] 
[51] [52] [53] [54] [55] 

И хотите, например, если я нажму на кнопку 34, чтобы изменить цвет кнопки 24 , 44, 33 и 35. Проблема заключается в том, что я не знаю, как это сделать, когда я нажимаю кнопку, чтобы вернуть любое из этих значений. Возьмите псевдокод того, что я хочу сделать.

When I press the button [i, j]: 
Change color of button[i-1, j]; 
Change color of button[i +1, j]; 
Change color of button[i, j +1]; 
Change color of button[i, j-1]; 

Так что, когда я нажимаю кнопку, мне нужно каким-то образом получить значения I, J на ​​кнопке, и я могу обрабатывать другие кнопки на тот же стиль (я +1, J и т.д.)

Я мог бы лечить отдельно каждую кнопку .....

private void button1_Click(object sender, EventArgs e) 
{ // change colors 
} 
private void button2_Click(object sender, EventArgs e) 
{ // change colors 
} 
private void button3_Click(object sender, EventArgs e) 
{ // change colors 
} 
.... 
private void button25_Click(object sender, EventArgs e) 
{ // change colors 
} 

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

То, что я хочу, что:

private void button[i][j]_Click(object sender, EventArgs e) 
{ 
button[i+1][j].BackColor = Color.Red; 
button[i][j+1].BackColor ...... etc. etc. 
    // I know is incorrect, but is just how I want to act, if you understand me. 
} 

Извините мой плохой английский.

+2

Используйте массивы и добавить тот же обработчик событий для каждой кнопки. –

+0

это может помочь вам получить больше ответов, если вы поместите дополнительные теги, которые указывают больше того типа развития, который вы делаете, т. Е. Winforms или веб-формы asp.net ... –

ответ

1

Я думаю, что самым элегантным решением является использование TableLayoutPanel, чтобы упорядочить все кнопки. После этого вы можете обработать все кнопки таким образом:

 private void button_Click(object sender, EventArgs e) 
     { 
      Button clickedBtn = sender as Button; 
      var cp = tableLayoutPanel1.GetCellPosition(clickedBtn); 

      Button up = (Button)tableLayoutPanel1.GetControlFromPosition(cp.Column, cp.Row - 1); 
      //up.Color = ... 
      Button down = (Button)tableLayoutPanel1.GetControlFromPosition(cp.Column, cp.Row + 1); 
      //etc 
     } 

Dont»забудьте проверить, если столбец/строка не является нулевой, прежде чем вычитание 1

+0

Блестящий. Я уверен, что это сработает. Не могу дождаться, чтобы попробовать! Спасибо! – user2105306

+0

@ пользователь2105306 не ждите, попробуйте;) – VladL

+0

IT WORKS! StackOverflow и его члены являются лучшими !!! – user2105306

0

Вы можете установить свойство Tag для чисел, то в общем методе щелчком мыши вы можете что-то вроде:

int i = Math.Floor(((int)sender.Tag)/10); 
int j = ((int)sender.Tag) - i; 

Или вы могли бы использовать массивы.

+0

Это может сработать. Я попробую завтра немного переписать мой код и вернуться, чтобы сказать вам, удалось ли мне это сделать. Спасибо. – user2105306

Смежные вопросы