Как реализовать выбор полной строки в GridView без кнопки выбора?

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

введите описание изображения здесь

Чтобы реализовать это, я использую следующий код:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // Set the hand mouse cursor for the selected row. e.Row.Attributes.Add("OnMouseOver", "this.style.cursor = 'hand';"); // The seelctButton exists for ensuring the selection functionality // and bind it with the appropriate event hanlder. LinkButton selectButton = new LinkButton() { CommandName = "Select", Text = e.Row.Cells[0].Text }; e.Row.Cells[0].Controls.Add(selectButton); e.Row.Attributes["OnClick"] = Page.ClientScript.GetPostBackClientHyperlink(selectButton, ""); } } 

С приведенным выше кодом возникают следующие проблемы:

  • Это отлично работает, только если для параметра EnableEventValidation для страницы установлено значение false .
  • Grid.DataBind() SelectedIndexChanged запускается только в том случае, если Grid.DataBind() вызывается в Page_Load для страницы (в каждой обратной передаче).

Я делаю что-то неправильно? Есть ли более эффективная реализация?


Изменить: если для параметра EnableEventValidation установлено значение true , появится следующая ошибка:

Недопустимый аргумент обратной передачи или обратного вызова. Проверка событий разрешена с использованием конфигурации или на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова берутся из серверного элемента управления, который их первоначально визуализировал. Если данные действительны и ожидаются, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.

    Вы должны добавить это на каждый ответ и не только на привязку данных. Поэтому вы должны использовать RowCreated -Event из GridView.

    Например

    (С #):

     protected void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';"; e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';"; e.Row.ToolTip = "Click to select row"; e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex); } } 

    (VB.Net):

     Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated If e.Row.RowType = DataControlRowType.DataRow Then e.Row.Attributes("onmouseover") = "this.style.cursor='pointer';this.style.textDecoration='underline';" e.Row.Attributes("onmouseout") = "this.style.textDecoration='none';" e.Row.ToolTip = "Click to select row" e.Row.Attributes("onclick") = Me.Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Select$" & e.Row.RowIndex) End If End Sub 

    Вместо того, чтобы делать это на RowCreated , вы можете сделать это на Render() . Таким образом, вы можете использовать перегрузку GetPostBackClientHyperlink с true на registerForEventValidation и избежать ошибки «неверный ответ / обратный вызов».

    Что-то вроде этого:

     protected override void Render(HtmlTextWriter writer) { foreach (GridViewRow r in GridView1.Rows) { if (r.RowType == DataControlRowType.DataRow) { r.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';"; r.Attributes["onmouseout"] = "this.style.textDecoration='none';"; r.ToolTip = "Click to select row"; r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + r.RowIndex,true); } } base.Render(writer); } 
             

    Попробуйте это добавить событие OnSelectedIndexChanged в сетке

      OnSelectedIndexChanged="Grid_SelectedIndexChanged" 

    а затем по коду

      protected void Grid_SelectedIndexChanged(object sender, EventArgs e) { GridViewRow row = gvSummary.SelectedRow; //Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString()); } 

    и установите EnableViewState = “false”, но здесь вам нужно выполнить еще две вещи, которые вы уже выполнили в своем коде, и установите EnableEventValidation на false и Grid Databinding на странице Load ..

    Попробуйте использовать вокруг вашего

    в коде ASPX, установите CommandName='Select' LinkButton CommandName='Select' И в командном событии item обработайте эту команду и задайте стиль выбранной строки!

    Давайте будем гением компьютера.