2012-03-21 2 views
0

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

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

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

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, описанный выше, оба из которых дали одинаковые результаты.

функция My 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, и когда я нажимаю одну из этих кнопок она никогда не достигается. Почему эта функция не вызывается моими кнопками?

EDIT: Я хочу выполнить это без использования JavaScript, если это возможно.

+0

что такое код на странице для приклада на? – Brian

+0

Я создаю кнопку программно, у меня нет кода на странице. Кнопка добавляется в ячейку, которая добавляется в строку, которая добавляется в таблицу, которая кодируется на странице. – Andrew

ответ

4

Вы используете 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); 
} 
+0

Нет, я не использую javascript; NameClick ссылается на функцию C# в вопросе. Является ли OnClientClick специфичным для javascript? – Andrew

+0

'OnClientClick' - это JS для выполнения при нажатии кнопки. См. [Свойство Button.OnClientClick в MSDN] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.onclientclick.aspx). –

+0

Так ли удаление 'cellButton.OnClientClick =" NameClick ";' line help? –

-2

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

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

Он создает элементы управления программным способом, а не разметкой. –

+0

Я создаю кнопку в файле .aspx.cs, связанном со страницей. Должен ли я все-таки поставить этот фрагмент кода на страницу? Если да, то где и почему? – Andrew

+0

затем добавьте обработчик события для кнопки –

1

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

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

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

+0

Я пытался избежать JavaScript, так как сайт, который я разрабатываю, предназначен для мобильных пользователей и, более конкретно, для мобильного приложения, которое я сам разрабатываю. Зная, что я мало разбираюсь в JavaScript и веб-браузерах, мне сказали, что API UIWebKit от Apple не автоматически обрабатывает JS правильно все время, поэтому вместо того, чтобы понять, как заставить приложение обрабатывать JS, я полностью избегаю этого. Я не понял, что свойство OnClientClick специфично для клиентской функции. – Andrew

1

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

в случае жизненного цикла страницы SaveControlState, LoadControlState

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