2009-10-14 2 views
1

У меня есть кнопка поиска на моей странице, которая запускает запрос в БД, вытаскивает и отображает некоторые записи в таблице, а для каждой записи я создаю кнопку. Это выглядит примерно так:asp.net - событие кнопки не запускается

List<Friend> friends = SearchFriend(searchStr); 
foreach (Friend f in friends) 
{ 
    TableCell addCell = new TableCell(), nameCell = new TableCell(); 

    addCell.Text = ""; 
    if (!f.IsMyFriend) 
    { 
      LinkButton addFriendBtn = new LinkButton(); 
      addFriendBtn.Text = "Add as Friend"; 
      addFriendBtn.Click += new EventHandler(addFriendBtn_Click); 
      addFriendBtn.ID = "add_" + f.ID.ToString(); 

      addCell.Controls.Add(addFriendBtn); 
    } 
    nameCell.Text = f.Name; 

    TableRow row = new TableRow(); 
    row.Cells.Add(addCell); 
    row.Cells.Add(nameCell); 

    SearchFriendTable.Rows.Add(row); 
} 

Проблема заключается в том, что событие LinkButton не срабатывает при нажатии (изменение LinkButton к простой кнопке не исправить это либо).

Это HTML, который я получаю в этой части:

<td><a id="ctl00_contentPH_add_2" href="javascript:__doPostBack('ctl00$contentPH$add_2','')">Add as Friend</a></td> 

Также - когда я поставил точку останова на Page_Load я вижу __EVENTTARGET с идентификатором этого элемента управления в нем - однако это событие никогда не начинает работать.

Любые подсказки? Спасибо.

+0

Показать код загрузки страницы, шт. – Restuta

+0

Это пусто: -O. защищен недействительным Page \ _load (объект отправителя, EventArgs е) { } – emk

ответ

1

Где и когда вы создали эту кнопку?

Если вы динамически создаете кнопки и хотите прослушать событие, вам нужно создать эту кнопку в событии PageInit. Всегда! Поэтому не используйте, если (! IsPostback)

+0

Вы правы - я не создаю кнопку внутри страницы \ _load, а внутри другого события. Как я могу это исправить? Я не понял часть ответа «if (! IsPostBack)» ... – emk

+0

Вам нужно создать кнопки в событии Page_Init. С IsPostback я имею в виду, что вам нужно воссоздать кнопку каждый запрос. Обычно вы инициализируете Grid или похожий только один раз - с проверкой IsPostback – Arthur

1

Попробуйте с этим.

<td><a id="ctl00_contentPH_add_2" href="javascript:__doPostBack('<%=ct100_contentPH_add_2.ClientId %>','')">Add as Friend</a></td> 
0

Добавить обработчик событий для кнопок ссылок и обработать эти события.

if (!f.IsMyFriend) 
    { 
      LinkButton addFriendBtn = new LinkButton(); 
      addFriendBtn.Text = "Add as Friend"; 
      addFriendBtn.Click += new EventHandler(addFriendBtn_Click); 
      addFriendBtn.ID = "add_" + f.ID.ToString(); 
      addFriendBtn.Click += new EventHandler(addFriendBtn_Click); 
      addCell.Controls.Add(addFriendBtn); 
    } 

событие:

protected void addFriendBtn_Click(object sender, EventArgs e) 
     { 
      LinkButton lnk = (LinkButton)sender; 
      // do your coding 
    } 
+0

У меня есть обработчик событий, конечно :). Проблема в том, что код внутри него никогда не запускается. – emk

2

Добавление ответа Himadri в:

Динамически добавляемые элементы управления должны быть перекоммутированы в странице инициализации. Затем произойдет событие. У меня был очень похожий вопрос Dynamically loaded Controls in a wizard

Смежные вопросы