Лучший отвечающий
Присвоение кнопкам из массива, разных обработчиков

Вопрос
-
К примеру объявлен массив с 30-ю кнопками, дальше в цикле задаются одинаковые свойства для кнопок, а вот события должны быть разными.
Вопрос собственно состоит в следующем, можно ли в цикле for например, присвоить кнопкам из массива разные обработчики событий, и если можно то как?- Перемещено Siddharth Chavan 1 октября 2010 г. 22:47 MSDN Forums Consolidation (От:Visual C#)
14 января 2010 г. 22:03
Ответы
-
Например можно присвоить через массив делегатов, но предварительно его все равно придется задать:
public delegate void event_Click(object sender, EventArgs e); public Form1() { InitializeComponent(); Button[] buttons = new Button[3]; event_Click[] delegates = new event_Click[3]{ new event_Click(button0_Click), new event_Click(button1_Click), new event_Click(button2_Click)}; Int32 location_Y = 13; for (Int32 i = 0; i < buttons.Length; i++) { buttons[i] = new Button(); buttons[i].Location = new System.Drawing.Point(13, location_Y); buttons[i].Name = "button"+i; buttons[i].Size = new System.Drawing.Size(75, 23); buttons[i].TabIndex = 0; buttons[i].Text = "button"+i; buttons[i].UseVisualStyleBackColor = true; //... buttons[i].Click += new System.EventHandler(delegates[i]); this.Controls.Add(buttons[i]); location_Y += 30; } } private void button0_Click(object sender, EventArgs e) { //... } private void button1_Click(object sender, EventArgs e) { //... } private void button2_Click(object sender, EventArgs e) { //... }
или если обработчики могут повторяться, то можн воспользоваться свитчем для уменьшения массива делегатов:
Button[] buttons = new Button[30]; event_Click[] delegates = new event_Click[3]{ new event_Click(button0_Click), new event_Click(button1_Click), new event_Click(button2_Click)}; Int32 location_Y = 13; for (Int32 i = 0; i < buttons.Length; i++) { buttons[i] = new Button(); buttons[i].Location = new System.Drawing.Point(13, location_Y); buttons[i].Name = "button" + i; buttons[i].Size = new System.Drawing.Size(75, 23); buttons[i].TabIndex = 0; buttons[i].Text = "button" + i; buttons[i].UseVisualStyleBackColor = true; //... switch (i) { case 0: case 1: case 2: case 3: buttons[i].Click += new System.EventHandler(delegates[0]); break;; case 4: case 5: buttons[i].Click += new System.EventHandler(delegates[1]); break; case 6: buttons[i].Click += new System.EventHandler(delegates[2]); break; default: buttons[i].Click += new System.EventHandler(delegates[0]); break; } this.Controls.Add(buttons[i]); location_Y += 30; }
Может быть есть и другие способы ;)
- Предложено в качестве ответа I.Vorontsov 15 января 2010 г. 12:35
- Помечено в качестве ответа I.Vorontsov 18 января 2010 г. 8:31
15 января 2010 г. 8:41
Все ответы
-
хм, а смысл использовать это в цикле..если все события разные?15 января 2010 г. 6:46
-
Например можно присвоить через массив делегатов, но предварительно его все равно придется задать:
public delegate void event_Click(object sender, EventArgs e); public Form1() { InitializeComponent(); Button[] buttons = new Button[3]; event_Click[] delegates = new event_Click[3]{ new event_Click(button0_Click), new event_Click(button1_Click), new event_Click(button2_Click)}; Int32 location_Y = 13; for (Int32 i = 0; i < buttons.Length; i++) { buttons[i] = new Button(); buttons[i].Location = new System.Drawing.Point(13, location_Y); buttons[i].Name = "button"+i; buttons[i].Size = new System.Drawing.Size(75, 23); buttons[i].TabIndex = 0; buttons[i].Text = "button"+i; buttons[i].UseVisualStyleBackColor = true; //... buttons[i].Click += new System.EventHandler(delegates[i]); this.Controls.Add(buttons[i]); location_Y += 30; } } private void button0_Click(object sender, EventArgs e) { //... } private void button1_Click(object sender, EventArgs e) { //... } private void button2_Click(object sender, EventArgs e) { //... }
или если обработчики могут повторяться, то можн воспользоваться свитчем для уменьшения массива делегатов:
Button[] buttons = new Button[30]; event_Click[] delegates = new event_Click[3]{ new event_Click(button0_Click), new event_Click(button1_Click), new event_Click(button2_Click)}; Int32 location_Y = 13; for (Int32 i = 0; i < buttons.Length; i++) { buttons[i] = new Button(); buttons[i].Location = new System.Drawing.Point(13, location_Y); buttons[i].Name = "button" + i; buttons[i].Size = new System.Drawing.Size(75, 23); buttons[i].TabIndex = 0; buttons[i].Text = "button" + i; buttons[i].UseVisualStyleBackColor = true; //... switch (i) { case 0: case 1: case 2: case 3: buttons[i].Click += new System.EventHandler(delegates[0]); break;; case 4: case 5: buttons[i].Click += new System.EventHandler(delegates[1]); break; case 6: buttons[i].Click += new System.EventHandler(delegates[2]); break; default: buttons[i].Click += new System.EventHandler(delegates[0]); break; } this.Controls.Add(buttons[i]); location_Y += 30; }
Может быть есть и другие способы ;)
- Предложено в качестве ответа I.Vorontsov 15 января 2010 г. 12:35
- Помечено в качестве ответа I.Vorontsov 18 января 2010 г. 8:31
15 января 2010 г. 8:41