Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement full row selecting in GridView without select button?

I'm implementing a feature that when the user press on any point in the row in a GridView the row will be selected instead of Select button.

enter image description here

To implement that, I'm using the following code:

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, "");     } } 

With the code above, there are the following problems:

  • This works fine only if I EnableEventValidation for the page is set to false.
  • The SelectedIndexChanged is only fired just in case the Grid.DataBind() is called in Page_Load for the page (in every postback).

Am I doing something wrong? Is there a better implementation?


Edit: When EnableEventValidation is set to true, the following error will appear:

Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

like image 215
Homam Avatar asked Jun 06 '11 10:06

Homam


2 Answers

You must add this on every postback and not only on databinding. Therefore you should use the RowCreated-Event of the GridView.

For example

(C#):

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 
like image 172
Tim Schmelter Avatar answered Oct 02 '22 11:10

Tim Schmelter


Instead of doing it on RowCreated, you could do it on Render(). That way you could use the overload of GetPostBackClientHyperlink with true on registerForEventValidation and avoid the "invalid postback/callback argument" error.

Something like this:

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);     } 
like image 40
alejandrobog Avatar answered Oct 02 '22 11:10

alejandrobog