Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка событий, динамические кнопки и их события 
V
    Опции темы
ziga
Дата 6.7.2007, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: нет
Всего: 1



Задача стоит такая: я должен определить сколько папок на диске С и на форме создать столько же кнопок сколько и папок – это сделал. Далее надо определить какую из этих кнопок я нажал – вот тут проблема помогите, как это сделать? Кнопки создаются массивом и при нажатии вызывается одна и тажа функция см. код:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace testbutton
{
    public partial class Form1 : Form
    {
        int y = 40;
        string[] name = Directory.GetDirectories(@"C:\");        //Масив имён папок
        int mas = Directory.GetDirectories(@"C:\").Length;      //Число папок


        Button[] mybt;  //Масив кнопок

        // Конструктор для кнопки
        private Button createButton(int x, int y, string name, string text)
        {
            Button button1;

            button1 = new System.Windows.Forms.Button();
            button1.AutoSize = true;
            button1.Location = new System.Drawing.Point(x, y);
            button1.Name = name;
            button1.Size = new System.Drawing.Size(75, 23);
            button1.TabIndex = 0;
            button1.Text = text;
            button1.UseVisualStyleBackColor = true;
            button1.Click += new System.EventHandler(this.button1_Click);
            return button1;
            
        }

        public Form1()
        {
            InitializeComponent();

            mybt = new Button[mas];

            for (int i = 0; i < mas; i++)
            {
                mybt[i] = createButton(100, i * y, "b" + i.ToString(), name[i].Substring(3, name[i].Length - 3));
            }

            for (int i = 0; i < mybt.Length; i++)
            {
                Controls.Add(mybt[i]);
            }
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Directory.GetDirectories(@"C:\").Length.ToString());
            


            MessageBox.Show(name[4].Substring(3, name[4].Length - 3));
        }
    }
}


Есть какие идеи?

PM MAIL   Вверх
Idsa
Дата 6.7.2007, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



В методе Button_Click (общий метод для всех кнопок, насколько я понимаю) делаем вот так:
Код

Button button = (Button)sender;

Теперь можешь делать с этим объектом все, что душе угодно, например, получить имя кнопки, получить содержимое tag и т.д. и т. п.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ziga
Дата 6.7.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: нет
Всего: 1



Можешь немного объяснить что такое Sender в собтиях что бы было более понятно как с ним работать ? Ну и что такое E? 
PM MAIL   Вверх
Idsa
Дата 6.7.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Сначала ты подписываешься на делегат:
Код

button1.Click += new System.EventHandler(this.button1_Click);

Делегат EventHandler требует от метода двух параметров: 1-й - object, 2-й - EventArgs. Когда происходит щелчек внутри кнопки smile, вызывается этот самый делегат с двумя параметрами: в 1-й записывается ссылка на объект - источник клика, во 2-й записывается полезная информация (хотя в данном случае не записывается ничего, т. к. EventArgs - пустой класс). Именно эти параметры и передаются в твой метод - обработчик.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ziga
Дата 6.7.2007, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: нет
Всего: 1



Спасибо, теперь васё встало на свои места  smile 
Вопросов больше нет.
PM MAIL   Вверх
SpaceSpace
Дата 6.7.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: нет
Всего: 10




Цитата

Можешь немного объяснить что такое Sender в собтиях что бы было более понятно как с ним работать ? 


Sender - это тот объект, который сгенерировал событие, т.е. конкретная кнопка

там где создаешь кнопки, указываешь ей имя.
вот по этому имени определяешь конкретные дейтвия,
т.е. в обработчике делаешь цикл по массиву имен,
Код

        private void button1_Click(object sender, EventArgs e)
        {
             /// вот ты получил имя кнопки
             string buttonName = (Button)sender.Name;
             
             ... дальше пробегаешся по массиву имен и делаешь нужные действия
        }



--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Idsa
Дата 6.7.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



SpaceSpace, твой код нерабочий. Нужно код
Код

   string buttonName = (Button)sender.Name;

заменить на
Код

  string buttonName = ((Button)sender).Name;



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
SpaceSpace
Дата 6.7.2007, 08:43 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: нет
Всего: 10



Цитата(Idsa @  6.7.2007,  08:08 Найти цитируемый пост)
SpaceSpace, твой код нерабочий.

ну ссорри. я же в форуме пишу а не в студии.
люди не тупы, сами догадаются.
а если не догадаются, не фиг им тут делать.
все равно ссори.



--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
ziga
Дата 6.7.2007, 08:44 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: нет
Всего: 1



Ну вы тут прям дибаты устроили ) 
Всем спасибо, всё работает !!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.