OnRowClick в GridView не принимает нажатие кнопки? - PullRequest
0 голосов
/ 05 августа 2011

У меня есть Crid / ASP.net GridView, который содержится в UserControl. Как у меня сейчас, gridview добавит атрибут onrowclick следующим образом:

protected void _gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(this.GridView, "EditRow$" + e.Row.RowIndex);
}

Однако я получаю неверную ошибку обратной передачи из-за EventValidation, когда происходит это событие щелчка. Кроме того, у меня есть кнопки в строке, которые используют GridViewRowCommands для перенаправления на другие страницы. К сожалению, я не могу заставить оба работать вместе (функция RowCommand никогда не запускается).

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

protected void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
   if (e.CommandName.ToString() == "EditRow" && e.CommandArgument.ToString() == "0")
      Response.Redirect(anotherURL);
   if (e.CommandName.ToString() == "BACK" && e.CommandArgument.ToString() == "0")
      Response.Redirect(thisURL);
}

И это кнопка, которую я использую в строке:

<asp:Button ID="_AddButton" runat="server" CommandName="BACK" CommandArgument="0" Text="Add" />

В идеале, row-onclick также будет использовать эти GridViewRowCommands, чтобы можно было обрабатывать перенаправление в одном месте. Тем не менее, я не уверен, как это сделать. Какие-нибудь предложения относительно лучшего подхода?

Спасибо за вашу постоянную поддержку!

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

В директиву страницы добавьте следующее:

EnableEventValidation="false";

После этого должно работать нормально.Это, вероятно, самый простой способ решения вашей проблемы.

Вы также можете сделать что-то вроде этого:

e.Row.Attributes["onclick"] = "javascript:onRowClick('" + e.Row.RowIndex + "');";

А в ASPX добавьте функцию JavaScript:

onRowClick = function(rowIndex){
   __doPostBack("<%=dataGridView1.UniqueID%>", rowIndex);
}

И, наконец, в своем коде добавьте переопределение RaisePostBackEvent:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    base.RaisePostBackEvent(source, eventArgument);

    int rowIndex = ToInt32.Parse(eventArgument);
    if (source is DataGridView)
    {
        if (source == dataGridView1)
        {
             GridViewRow row = dataGridView1.Rows[rowIndex];
        }
    }
}
0 голосов
/ 23 мая 2013

Я справился с подобной проблемой, добавив событие клика на стороне клиента к каждой строке.

  1. Добавьте обработчик события OnRowDataBound в представление сетки.

    OnRowDataBound="GridView_RowDataBound
    
  2. В обработчике события OnRowDataBound добавьте атрибут «onclick», который захватывает первичный ключ для записи и передает его в URL-адресе перенаправления.

    protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int id = Convert.ToInt32(e.Row.Cells[0].Text);
            e.Row.Attributes["onclick"] = string.Format("javascript: window.location = 'Edit.aspx?id={0}'", id);
        }
    }
    

Обратите внимание, чтоэто предполагает, что первый столбец вашего вида сетки является вашим первичным ключом.

0 голосов
/ 05 августа 2011

Я не уверен, как добавлять комментарии, так что ответ придется делать.

Вы говорите, что это не относится к методу RowCommand?Если нет, я бы рассмотрел передачу события следующим образом через страницу инициализации.

GridView1.OnRowCommand += _gridView_RowCommand
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...