Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Динамические кнопки


Автор: Kefir 6.3.2006, 11:11
Задача такова - из БД (мускул) выбираются категории (например: Рестораны, Бары, Клубы, ...). Далее программа должна вывести эти категории в виде кнопок (можно и не кнопок - главное чтобы выглядело как кнопки smile ). Кол-во кнопок (=категорий) я могу получить из БД с помощью COUNT. И вот у меня появилась проблема:
1. Как сделать генерацию кнопок?
2. Как сделать так, чтобы нажатия на кнопки имели свой собственный эвент?

Автор: Exception 6.3.2006, 11:34
Теоретически должно работать.
Код
foreach(string s in categories)
{
    Button b = new Button();
    b.Text = s;
    b.Click += new EventHandler(OnButtonClick);
    t.Controls.Add(b);
}
Ну и, соответственно, пишешь метод OnButtonClick.

Автор: Kefir 6.3.2006, 11:46
Гм... я сейчас не могу проверить, но ведь с таким кодом у меня будет куча кнопок b с обработчиком клика? как их различать-то?..

Автор: chwind 6.3.2006, 12:05
System::Object * sender
в Обработчике преобразовывай sender обратно к бутону и анализируй его свойство Текст или лучше записывай в момент создания кнопок что нибудь осмысленое в Tag и потом амнализируй это свойство


Код

System::Void ButtonClick(System::Object *  sender, System::EventArgs *  e)
{
  System::Windows::Forms::Button *  Button = dynamic_cast<System::Windows::Forms::Button *>(sender);
  if (Button->Text...)
  {
    ...
  }
}


Код писал для с++, думаю для шарпа приведение типов будет выглядеь попроще smile

Автор: Exception 6.3.2006, 12:28
Код
void ButtonOnClick(object sender, EventArgs e)
{
    switch(((Button)sender).Text)
    {...}
}
Должно быть так.

Автор: Kefir 6.3.2006, 12:36
Exception, спасибо... идкю я понял... но теперь другой вопрос - а если у меня две такие кнопки с одинаковым текстом - то есть ли куда записать, например, id записи в БД (в классе кнопки) или мне надо будет расширять этот класс чтобы добавить такую фичу? Я просто назначение многих параметров в кнопке не знаю - запишу ещё чего-нибудь не так/не туда... smile

Автор: mr.DUDA 6.3.2006, 12:50
Цитата(Kefir @ 6.3.2006, 11:36 Найти цитируемый пост)
Exception, спасибо... идкю я понял... но теперь другой вопрос - а если у меня две такие кнопки с одинаковым текстом - то есть ли куда записать, например, id записи в БД (в классе кнопки) или мне надо будет расширять этот класс чтобы добавить такую фичу? Я просто назначение многих параметров в кнопке не знаю - запишу ещё чего-нибудь не так/не туда.


chwind же написал:

Цитата(chwind @ 6.3.2006, 11:05 Найти цитируемый пост)
лучше записывай в момент создания кнопок что нибудь осмысленое в Tag и потом амнализируй это свойство


Можно хоть ID хоть сам DataRow в Tag запихнуть...

Автор: 4YBAK 8.3.2006, 18:41
У меня чет никак не хочет работать:

Код

for(int k=1;k<=4;k++)
            {
                Button knopka=new Button();
                knopka.Text="Кнопка";
                knopka.Location=new Point(100,50*k);
                knopka.Click+=new EventHandler(knopkaClick);
                knopka.Tag=k;
                this.Controls.Add(knopka);

            }

void knopkaClick(object sender, System.EventArgs e)
{        
      switch(((Button)sender).Tag)  //В этой строчке выдает ошибку: A value of an integral type expected

       {
            case 1:
                     {...} 
                 break;

       }
}

Мне надо в зависимости от того, какое число в Tag у кнопки, выполнять то или иной код...

Автор: Kefir 8.3.2006, 19:25
4YBAK, попробуй к int привести.

Автор: 4YBAK 8.3.2006, 20:42
Цитата(Kefir @ 8.3.2006, 19:25 Найти цитируемый пост)
попробуй к int привести.

Стопудова! Работает!

Сорри за небольшой офтоп: чем отличается приведение типа c помощью (int) от Convert.ToInt32()
Пока не ответите, заснуть не смогу ))


Автор: 4YBAK 8.3.2006, 22:11
smile

Тогда для чего это вообще было сделано? 2 записи одного и того же действия?

Автор: Дрон 8.3.2006, 22:42
Цитата(4YBAK @ 8.3.2006, 22:11 Найти цитируемый пост)
2 записи одного и того же действия?

Нет!!!
Это принципиально разные действия.
Тов. Exception, зачем вы человека с толку сбиваете? Это ж не VB, а C#.

(int) это приведение типа. Т.е. если у тебя есть переменная в которой хранится число, но её тип не int, а, например, object, то можно сделать так:
Код

object obj = 5;
int n = (int)obj;


Convert.ToInt32 используется, когда ты не уверен, что там хранится число. Например если там строка, то ты просто так привести её к int не можешь.
Код

string str = "5";
int n = (int)str; // будет ошибка

А вот если написать:
Код

int n = Convert.ToInt32(str);

То всё будет хорошо. Будет вызван метод Int32.Parse(str); и сделан разбор строки.

Короче, (int) это уточнение, что у тебя там не просто так, а именно int.
А Convert.ToInt32 -- это преобразование данных любого типа в int.

Автор: Exception 9.3.2006, 00:05
Спасибо, что указал на ошибку. Исправлюсь smile

Автор: 4YBAK 9.3.2006, 02:43
Дрон, Понял! Пасиба!
Т.е. в принципе надежнее юзать Convert.ToInt32() нежели (int). Т.к. в первом случае уж точно никаких ошибок не будет?
И вопрос номер последний: Разница между Int32.Parse(str) и Convert.ToInt32()

Автор: Дрон 9.3.2006, 09:51
Цитата(4YBAK @ 9.3.2006, 02:43 Найти цитируемый пост)
Разница между Int32.Parse(str) и Convert.ToInt32()

Вот тут разницы уже практически нет smile
Convert.ToInt32 вызывает для строк метод Int32.Parse
Но лучше пользоваться Convert smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)