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.
Try this one add OnSelectedIndexChanged event in grid
OnSelectedIndexChanged="Grid_SelectedIndexChanged"
and then on code behind
protected void Grid_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewRow row = gvSummary.SelectedRow;
//Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString());
}
and set EnableViewState="false" but here u have to perform two more things that u have already done in your code means set EnableEventValidation to false and Grid Databinding on page Load..
Try using <asp:LinkButton> around your <tr> in ASPX code, set the LinkButton's CommandName='Select' And in item command event, process this command and set the style of a selected row!
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
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);
}
<style type="text/css">
.hiddenColumn
{
display: none;
}
.rowGrid
{
cursor: pointer;
}
</style>
<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" >
<RowStyle CssClass="rowGrid" />
<Columns>
<asp:CommandField ButtonType="Button" ShowSelectButton="true" HeaderStyle-CssClass="hiddenColumn"
ItemStyle-CssClass="hiddenColumn" FooterStyle-CssClass="hiddenColumn" />
</Columns>
</asp:GridView>
<script type="text/javascript">
$(function () {
$("#<%= GridView1.ClientID %> tr.rowGrid")
.live("click", function (event) {
$(this).find("input[type='button'][value='Select']").click();
});
$("#<%= GridView1.ClientID %> input[type='button'][value='Select']")
.live("click", function (event) {
event.stopPropagation();
});
});
</script>