2009-07-10 5 views
0

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

while(drr.Read()) 
      { 
       LinkButton lb = new LinkButton(); 
       lb.Click += new EventHandler(lb_Click); 

       lb.Text = drr[2].ToString(); 

       PlaceHolderQuestions.Controls.Add(lb); 

      } 

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

void lb_Click(object sender, EventArgs e) 
    { 
     DownloadFile(); 
    } 

как я могу знать, какая кнопка нажата?

ответ

1

У вас есть параметр Sender. Это указатель объекта вызывающего объекта, в вашем случае один из LinkButtons.

Тестировать, если отправитель имеет тип LinkButton. Если да, прочитайте его текст, и вы знаете, что это было.

Давайте скажем, кнопки Text является файл для загрузки:

void lb_Click(object sender, EventArgs e) 
{ 
    if (Sender is LinkButton) 
    { 
    DownloadFile((Sender as LinkButton).Text); 
    } 
} 

Линия

if (Sender is LinkButton) 

необходимо предотвратить исключение во время выполнения, если кто-то решил использовать lb_Click как событие на другой компонент. ListBox был бы кандидатом, так как он также сокращается до lb (если человек уважает нотную марку).

Вы можете улучшить функцию для работы с другими компонентами легко:

void lb_Click(object sender, EventArgs e) 
{ 
    if (Sender is LinkButton) 
    { 
    DownloadFile((Sender as LinkButton).Text); 
    } else 
    if (Sender is ListBox) 
    { 
    DownloadFile((string)(Sender as ListBox).SelectedItem); 
    } 
} 
+0

Чтобы быть честным, проверка была бы излишней, так как это lb_Click, который указывает, что он должен только быть ссылками на него. – James

+0

Верно, но я хотел бы убедиться. Скажем, кто-то еще работает над вашим кодом и использует lb_Click для чего-то другого, кроме LinkButton. Всякий раз, когда я вызываю объект, я тестирую его, чтобы предотвратить ошибки во время выполнения. –

+0

Да, я на самом деле делаю то же самое, однако меня критиковали в прошлом за то, что я был слишком осторожен. Хотя в этот конкретный случай, возможно, стоит проверить, что я думаю об этом, так как его можно путать с ListBox! Я обновил свое решение. – James

0

Вы можете использовать CommandArgument, чтобы различать кнопки ссылок.

// Define Button : 
LinkButton lb = new LinkButton(); 
lb.CommandArgument = drr[2].ToString(); 
lb.Command += new CommandEventHandler(lb_Command); 

void lb_Command(Object sender, CommandEventArgs e) 
{ 
    string stringToDifferentiateButton = e.CommandArgument.ToString(); 
    DownloadFile(); 
} 
+0

эй ТНХ, но «е» оленья кожа есть CommandArgument. только равен, gethashcode, gettype, tostring. –

+0

Да, я обновил свой ответ, если вы используете CommandEventArgs в качестве аргумента, вы можете получить CommandArgument. – Canavar

+0

говорит: «Ожидайте метод с (object, EventArgs)» и когда я определяю его как lb.Click + = new CommandEventHandler (lb_Click); это говорит Невозможно неявно преобразовать тип 'System.Web.UI.WebControls.CommandEventHandler' в 'System.EventHandler' –