Почему мой элемент управления ASP.NET Button не вызывает назначенную функцию? - PullRequest
0 голосов
/ 22 марта 2012

Я хочу настроить функцию поиска на моем веб-сайте. Пользователь вводит некоторую информацию в текстовое поле и нажимает кнопку поиска. При нажатии на кнопку поиска выполняется поиск в базе данных с использованием текста в текстовом поле, а результаты отображаются в виде таблицы. Если текст в текстовом поле полностью соответствует одному результату из базы данных, а не отображать список результатов, на странице заполняется подробная информация о результате сопоставления.

Чтобы упростить точное сопоставление результатов, я хочу добавить рядом с каждым результатом кнопку, которая «выбирает» этот результат, заполняя текстовое поле текстом этого результата и, следовательно, заполняя страницу деталями. Вот что у меня есть.

После нажатия кнопки поиска, после проверки, чтобы убедиться, что результат соответствует точно, я создаю таблицу, которая содержит результаты и кнопки:

for(int x=0; x < res_list.Length; x++)
{
     TableRow newRow = new TableRow();
     TableCell textCell = new TableCell();
     TableCell buttonCell = new TableCell();
     buttonCell.ID = "bc" + x;
     Button cellButton = new Button();
     cellButton.ID = "btn" + x;
     textCell.Text = res_list[x];
     textCell.Attributes.Add("Width","60%");
     cellButton.Text = x.ToString();

     // cellButton.OnClientClick = "NameClick"; This property refers to client-side scripts, which I am not using.
     cellButton.Click += new EventHandler(NameClick);

     buttonCell.Controls.Add(cellButton);
     newRow.Cells.Add(firstCell);
     newRow.Cells.Add(buttonCell);
     myTable.Rows.Add(newRow);
}

Я пробовал как метод OnClientClick, так и метод Click, показанный выше, оба из которых дали одинаковые результаты.

Моя функция NameClick выглядит следующим образом:

void NameClick(object sender, EventArgs e)
{
     Button sendButton = (Button)sender;
     int index = Int32.Parse(sendButton.Text);
     SearchTextBox.Text = myTable.Rows[index].Cells[0].Text;
     return;
}

Я установил точку останова в начале функции NameClick, и когда я нажимаю одну из этих кнопок, она никогда не достигается. Почему эта функция не вызывается моими кнопками?

РЕДАКТИРОВАТЬ: Я хочу сделать это без использования JavaScript, если это возможно.

Ответы [ 4 ]

4 голосов
/ 22 марта 2012

Вы используете cellButton.OnClientClick = "NameClick";, но есть ли у вас функция NameClick в вашем javascript?В противном случае нажатие кнопки вызовет ошибку JS, которая, вероятно, заблокирует обратную передачу.

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

Должно работать что-то вроде следующего (не проверено):

myTable.ID = "someid";
for (int x=0; x < res_list.Length; x++)
{
  TableRow newRow = new TableRow();
  newRow.ID = "r" + x;
  TableCell textCell = new TableCell();
  TableCell buttonCell = new TableCell();
  buttonCell.ID = "bc" + x;
  Button cellButton = new Button();
  cellButton.ID = "btn" + x;
  textCell.Text = res_list[x];
  textCell.Attributes.Add("Width","60%");
  cellButton.Text = x.ToString();

  //cellButton.OnClientClick = "NameClick"; // not needed unless you have actual JS for it
  cellButton.Click += new EventHandler(NameClick);

  buttonCell.Controls.Add(cellButton);
  newRow.Cells.Add(firstCell);
  newRow.Cells.Add(buttonCell);
  myTable.Rows.Add(newRow);
}
1 голос
/ 22 марта 2012

когда вы нажимаете на кнопку, страница снова запускает жизненный цикл, и ваш элемент управления не существует на странице, вам нужно снова создать элемент управления или сохранить его в состоянии просмотра или использовать состояние элемента управления когда он перезвонит в жизненном цикле

в событии жизненного цикла страницы SaveControlState, loadControlState

если вы хотите создать событие щелчка javascript, вам нужно убедиться, что элемент управления не вызывает событие на стороне сервера, для этого в функции javascript необходимо вернуть false

1 голос
/ 22 марта 2012

cellButton.OnClientClick должен указывать на функцию на стороне клиента, то есть JavaScript.У вас есть где-нибудь функция JS?

Если ответ отрицательный, то мы нашли вашу проблему.Вы должны создать один.Будет полезно установить свойство ClientIDMode ваших динамически генерируемых элементов управления на Static или Predictable, чтобы ваша функция JS могла легко получить к ним доступ.

Вам нужна помощь с функцией JS?

0 голосов
/ 22 марта 2012

Вы должны добавить это событие в свой синтаксис asp для кнопки.

 <asp:Button runat="server " OnClick="ButtonClick"/>
...