У меня есть GridView
с несколькими столбцами. Когда вы нажимаете в любом месте строки, появляется PostBack с командой, за исключением последнего столбца, который является кнопкой Delete, которая имеет свою собственную команду, связанную с ней. Я могу сделать это, используя
protected override void Render(HtmlTextWriter writer)
{
foreach (GridViewRow r in CourtGrid.Rows)
{
if (r.RowType == DataControlRowType.DataRow)
{
//Clicking any cell will open the details page, except for the last cell, which is Delete
for (int i = 0; i < r.Cells.Count - 1; ++i)
{
r.Cells[i].Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(CourtGrid, "Edit$" + r.RowIndex, true);
}
//Much lighter page produced
//r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(CourtGrid, "Edit$" + r.RowIndex, true);
}
}
base.Render(writer);
}
Но это добавляет много дополнительных данных на страницу. В источнике указывается один столбец
<tr>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">ADAIM</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">Ada</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">Municipal</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">Ada</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">County</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">Ada</td>
<td onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">ID</td>
</tr>
Но если вы снова посмотрите на мой код, вы увидите, что строка прокомментирована
r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(CourtGrid, "Edit$" + r.RowIndex, true);
Если я использую этот код, вместо этого получаю гораздо более легкий ряд
<tr onclick="javascript:__doPostBack('ctl00$ctl00$MainContent$PageContent$CourtGrid','Edit$0')">
<td>ADAIM</td>
<td>Ada</td>
<td>Municipal</td>
<td>Ada</td>
<td>County</td>
<td>Ada</td>
<td>ID</td>
</tr>
Но затем, когда нажата кнопка "Удалить", я получаю команды "Удалить" и "Редактировать", которые мне не нужны. Есть ли способ получить светлый результат реализации полной строки, все еще игнорируя эту последнюю ячейку?
Это нормальное поведение. Случается, что последняя ячейка находится внутри строки, сначала происходит щелчок ячейки, а затем происходит событие щелчка строки. И я предполагаю, что вы можете использовать это поведение для барботирования событий, чтобы остановить распространение события click. Таким образом, когда происходит щелчок ячейки, вы должны остановить распространение события click. Например,
element.onclick = function(e){
e.stopPropagation();
};
Этот пример JSFiddler демонстрирует его с помощью простой таблицы html. Итак, я думаю, это просто вопрос изменения обработчика события клика, чтобы вызвать обратную передачу и остановить распространение события, что похоже на это...
r.Attributes["onclick"] = string.Format(@"function(e){{
__doPostBack(&#{0};{1}&#{0};,&#{0};Edit$0&#{0};);
e.stopPropagation();
}}", r.RowIndex, CourtGrid.UniqueID);
Обратите внимание, что я не тестировал это, поэтому не делайте никаких предположений, но он должен дать вам представление о том, как добиться того же. Надеюсь, что это имеет смысл