Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
1

как мне для кнопок создать обработчик

13.01.2010, 14:25. Показов 7178. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я создал кнопки таким образом
C#
1
2
3
4
5
6
for (int i = 0; i < n; i++)
            {
                Button tb = new Button();
                tb.Top = 30 * i;
                this.Controls.Add(tb);
            }
как мне для этих кнопок создать обработчк, что б при нажатии на одну, менялось свойство другой?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2010, 14:25
Ответы с готовыми решениями:

Создать массив кнопок, для каждой кнопок будет одинаковый обработчик
Всем привет! Нужна помощь в реализации такой задачи. Нужно создать массив кнопок, для каждой...

Как вызвать обработчик события для двух кнопок?
Не могу понять как вызвать обработчик есть у Меня код private EventHandler&lt;ActionEvent&gt;...

Не могу создать обработчик двух кнопок
Я новенький в среде разработке Eclipse под Андроид. Не могу создать программку, а вернее обработчик...

Динамически создать 15 кнопок на форме и сделать общий обработчик OnClick
Здравствуйте, создаю 15 кнопок вот так: HWND hWnd = this-&gt;Handle; long hThisInstance =...

23
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
13.01.2010, 14:49 2
C#
1
tb.Click += new System.EventHandler(tb_Click);
C#
1
2
3
4
private void tb_Click(object sender, EventArgs e)
{
    ...
}
0
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
13.01.2010, 16:21  [ТС] 3
пробовал уже, вставлял код в цыкл вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0; i < n; i++)
            {
                Button tb = new Button();
                tb.Top = 30 * i;
                this.Controls.Add(tb);
 
tb.Click += new System.EventHandler(tb_Click);
private void tb_Click(object sender, EventArgs e)
{
    ...
}
            }
Выдаёт ошибки. Может не туда написал код?
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
13.01.2010, 16:54 4
Напиши конкретнее, что нужно. Тебе нужен массив кнопок?
0
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
13.01.2010, 20:09  [ТС] 5
Я в цыкле создаю несколько кнопок, создаются без проблем. Но они все пустые, т.е. при нажатии на них ни чего не происходит. А мне нужно, чтобы все эти кнопки вызывалт один и тот же метод, для этого я в цыкл добавил
C#
1
2
3
4
5
tb.Click += new System.EventHandler(tb_Click);
private void tb_Click(object sender, EventArgs e)
{
    метод
}
так как написал в предыдущем сообщении, результата нет, выдаёт ошибки
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
13.01.2010, 21:21 6
Это вставить куда угодно
C#
1
2
3
4
5
6
7
8
9
int n=4;
Button[] tb = new Button[n];
for (int i = 0; i < n; i++)
{
    tb[i] = new Button();
    tb[i].Top = 30 * i;
    tb[i].Click += new EventHandler(button_Click);
    this.Controls.Add(tb[i]);
}
А это как отдельную функцию
C#
1
2
3
4
private void button_Click(object sender, EventArgs e)
{
    MessageBox.Show("your method");
}
1
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
13.01.2010, 22:50  [ТС] 7
Спасибо большое, заработало!
Как я понял создаётся массив кнопок!? А можно как нибудь получить номер кнопки на которую нажали, чтобы метод использовал эту цифру? Чтоб при нажатии на разные кнопки, метод обрабатывал разные цифы и получался разный результат.
C#
1
2
3
4
5
private void button_Click(object sender, EventArgs e)
{
j=номер кнопки;
   Мой_метод(в котором используется j)
}
0
274 / 200 / 33
Регистрация: 18.04.2009
Сообщений: 177
13.01.2010, 23:30 8
Насчёт номера - не в курсе, а вот имя этой кнопки - можно, как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//вводим переменную, которая вернёт нам имя контрола
private Control m;
 
private void button_Click(object sender, EventArgs e)
{
   //так в заголовок формы мы выведем имя контрола, на который нажали - это при
   //том условии, что у всех динамически созданных кнопок один обработчик события
   m = (Control)sender;
   this.Text = m.Name.ToString();
 
   //а дальше твой обработчик, как-то так:
   if(m.Name == "button1")
   {
       //что-то делаем, и так для всех.
   }
   if(m.Name == "button2")
   {
       //что-то делаем, и так для всех.
   }
   if(m.Name == "button3")
   {
       //что-то делаем, и так для всех.
   }
   if(m.Name == "button4")
   {
       //что-то делаем, и так для всех.
   }
}
Вот только имя нужно кнопкам не забыть дать, чтобы заранее знать, как к ним обратиться:
C#
1
2
3
4
5
6
7
8
9
10
int n=4;
Button[] tb = new Button[n];
for (int i = 0; i < n; i++)
{
    tb[i] = new Button();
    tb[i].Top = 30 * i;
    tb[i].Click += new EventHandler(button_Click);
    tb[i].Name = "button" + i.ToString();
    this.Controls.Add(tb[i]);
}
1
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
14.01.2010, 19:14  [ТС] 9
Сделал!!!
Спасибо Стасёнок! Я номер кнопок из имени получил!
Вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
m = (Control)sender;
 
            string imya = m.Name;
            int dlinaName = imya.Length,t;
            StringBuilder imyaBuilder = new StringBuilder(imya);
            StringBuilder chislo = new StringBuilder("a");
            for (t = 6; t < dlinaName; t++)
            {
                if (t == 6)
                {
                    chislo[0] = imyaBuilder[t];
                }
                else 
                {
                    chislo.Append(imyaBuilder[t]);
                }
                
            }
t=chislo.ToString();
Всем огромное спасибо! Очень помогли!
0
101 / 101 / 19
Регистрация: 29.12.2009
Сообщений: 204
14.01.2010, 20:33 10
у компонентов есть свойство Tag - записываете туда номер при создании, считываете в обработчике
1
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
15.01.2010, 00:11  [ТС] 11
verzer Где ты раньше был! С Tag еще лучше стало! Код всего 2 срочички! А я, балда, голову ломал, код придумывал... Спасибо всем кто принял участие в решении моей проблемки!

Добавлено через 2 часа 12 минут
Еще такой вопрос! Как ткперь сделать, чтоб при нажатии на любую кнопку свойство Enabled другой кнопки стало false???

Добавлено через 10 минут
Свойства кнопок возданых вручную меняется без проблем, а вот изменить Enabled динамически созданой кнопки не выходит
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
15.01.2010, 01:19 12
C#
1
2
3
4
5
6
7
8
9
10
11
private void button_Click(object sender, EventArgs e)
        {
            foreach (Button bt in this.Controls)
            {
                if (bt.Tag != ((Button)sender).Tag)
                {
                    bt.Enabled = false;
                }
            }
                        
        }
Добавлено через 1 минуту
Кнопки были созданы оработчиком:
C#
1
2
3
4
5
6
7
8
9
10
11
12
int n = 4;
            Button[] tb = new Button[n];
            for (int i = 0; i < n; i++)
            {
                tb[i] = new Button();
                tb[i].Top = 30 * i;
                tb[i].Click += new EventHandler(button_Click);
                tb[i].Name = "button" + i.ToString();
                tb[i].Text = tb[i].Name;
                tb[i].Tag = i;
                this.Controls.Add(tb[i]);
            }
0
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
15.01.2010, 01:21 13
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Button[] but = new Button[4];
        private Control ctrl;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 4; i++)
            {
                but[i] = new Button();
                but[i].Top = 30 * i;
                but[i].Click += new EventHandler(button_Click);
                but[i].Name = "b" + i.ToString();
                this.Controls.Add(but[i]);
            }
        }
 
        private void button_Click(object sender, EventArgs e)
        {
            ctrl = sender as Control;
            switch (ctrl.Name)
            {
                case "b0":
                    {
                        but[1].Enabled = false;
                        but[2].Enabled = false;
                        but[3].Enabled = false;
                        break;
                    }
                case "b1":
                    {
                        but[0].Enabled = false;
                        but[2].Enabled = false;
                        but[3].Enabled = false;
                        break;
                    }
                case "b2":
                    {
                        but[1].Enabled = false;
                        but[0].Enabled = false;
                        but[3].Enabled = false;
                        break;
                    }
                case "b3":
                    {
                        but[1].Enabled = false;
                        but[2].Enabled = false;
                        but[0].Enabled = false;
                        break;
                    }
                default:
                    break;
            }
        }
    }
}
Можно так попробывать
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
15.01.2010, 01:22 14
Цитата Сообщение от Alligieri Посмотреть сообщение
if (bt.Tag != ((Button)sender).Tag)
можно менять в соответствии с нуждами (например bt.Tag==2)

Добавлено через 1 минуту
Hamsterr, это ж зачем так извращатся?
1
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
15.01.2010, 01:50  [ТС] 15
Alligieri, Выдаё такое сообщение для foreach (Button bt in this.Controls): Не удалось привести тип объекта "System.Windows.Forms.TextBox" к типу "System.Windows.Forms.Button". для foreach (Button bt in this.Controls)

Добавлено через 5 минут
Hamsterr, Беда еще и втом, что количество создаваемых кнопок пользователь сам определяет(от 16 до 225)
0
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
15.01.2010, 02:05 16
Hamsterr, Беда еще и втом, что количество создаваемых кнопок пользователь сам определяет(от 16 до 225)
Лучше использовать, вариант Alligieri, он более удобный А можно на исходник посмотреть, что бы попробывать понять из - за чего ошибка вылетает
0
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
15.01.2010, 08:29  [ТС] 17
Создание кнопок:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
        private void button2_Click(object sender, EventArgs e)
        {
            reb = Convert.ToInt32(rebro_textBox.Text);
            razm = Convert.ToInt32( Math.Pow(reb, 2));
            //rebro_textBox.Text = Convert.ToString(razm);
 
            int j=2,jj=0;
            string[] imya = new string[razm];
            Button[] tb = new Button[razm];
            for (int i = 0; i < razm; i++)
            {
                 
                 tb[i] = new Button();
 
                    if (i < reb)
                    {
                        tb[i].Top = 22;
                    }
                    else if (i == reb)
                    { 
                        tb[i].Top = 22 * j;
                        jj = 0;
                    }
                    else if (i % reb == 0)
                    {
                        j++;
                        jj = 0;
                        tb[i].Top = 22 * j;
                    }
                    else
                    {
                    tb[i].Top = 22 * j;
                    }   
 
                    tb[i].Left = 26 * jj;
                    jj++;
                    tb[i].Width = 27;
                    imya[i] = tb[i].Name;
                    tb[i].Text = Convert.ToString(i + 1);
                    tb[i].Name = "button" + i.ToString();
                    tb[i].Tag = i;
                    tb[i].Click += new EventHandler(button_Click);
                    this.Controls.Add(tb[i]);
 
            }
 
            
            
        }
обработчик для них:
C#
1
2
3
4
5
6
7
8
9
10
11
12
private Control f;
        private void button_Click(object sender, EventArgs e)
        {
            f = (Control)sender;
foreach (Button bt in this.Controls)
            {
                if (bt.Tag != ((Button)sender).Tag)
                {
                    bt.Enabled = false;
                }
            }
}
0
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
15.01.2010, 14:06 18
Генерация
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int Rebro = 0, Razmer = 0;
            int j = 2, jj = 0;
            Rebro = Convert.ToInt32(RebroBox.Text);
            Razmer = Convert.ToInt32(Math.Pow(Rebro, 2));
 
            string[] imya = new string[Razmer];
            Button[] but = new Button[Razmer];
 
            for (int i = 0; i < Razmer; i++)
            {
                but[i] = new Button();
 
                if (i < Rebro)
                {
                    but[i].Top = 22;
                }
                else if (i == Rebro)
                {
                    but[i].Top = 22 * j;
                    jj = 0;
                }
                else if (i % Rebro == 0)
                {
                    j++;
                    jj = 0;
                    but[i].Top = 22 * j;
                }
                else
                {
                    but[i].Top = 22 * j;
                }
 
                but[i].Left = 26 * jj;
                jj++;
                but[i].Width = 27;
                imya[i] = but[i].Name;
                but[i].Text = Convert.ToString(i + 1);
                but[i].Name = "button" + i.ToString();
                but[i].Tag = i;
                but[i].Click += new EventHandler(button_Click);
                this.Controls.Add(but[i]);
            }
Обработчик
C#
1
2
3
4
5
6
7
8
9
10
11
foreach (object bt in this.Controls)
            {
                if (bt.GetType() == typeof(System.Windows.Forms.Button))
                {
                    Button but = bt as Button;
                    if (but.Tag != ((Button)sender).Tag)
                    {
                        but.Enabled = false;
                    }
                }
            }
ошибка вылетала потому что, из this.Control брались все элементы, включая и textBox-ы, а программа пыталась занести их в объект класса Button. Нужно было просто отбросить все ненужные элементы и оставить только кнопки Вот как - то так
1
7 / 7 / 1
Регистрация: 13.01.2010
Сообщений: 82
15.01.2010, 16:32  [ТС] 19
HamsterrОгромное спасидо! Работает!
Есть еще одна тонкость, меняется Enabled всех объктов формы, а нужно поменять Enabled 3х кнопок.
0
8 / 8 / 0
Регистрация: 19.11.2009
Сообщений: 33
15.01.2010, 16:39 20
Цитата Сообщение от faton99 Посмотреть сообщение
HamsterrОгромное спасидо! Работает!
Есть еще одна тонкость, меняется Enabled всех объктов формы, а нужно поменять Enabled 3х кнопок.
Enabled меняется только у всех кнопок на форме, остальные элементы остаются не тронутыми. Для того что бы это свойство менялось только у динамических кнопок, нужно для статических прописать уникальные Tag-и и отсеевать их.
0
15.01.2010, 16:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2010, 16:39
Помогаю со студенческими работами здесь

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

Один обработчик для 9 кнопок
Привет, ребята. Нужна Ваша помощь. Пишу небольшую обучающую программку. Вот в чем проблема. На...

Один обработчик для нескольких кнопок
Вопрос: Как для калькулятора создать один обработчик для цифровых кнопок (0-9), чтобы для каждой...

Один обработчик для динамических кнопок
Кнопки создаются/удаляются, и у них один OnClickListener. Но при нажатии, надо получить текст...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru