如何在没有selectbutton的情况下在GridView中实现全行select?

我正在实现一个function,当用户按下GridView中的行中的任何一点,行将被选中,而不是selectbutton。

在这里输入图像描述

为了实现这一点,我使用下面的代码:

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才能正常工作。
  • SelectedIndexChanged只是为了防止在页面的Page_Load调用Grid.DataBind() (在每个回发中)而被触发。

我做错了什么? 有更好的实施?


编辑:EnableEventValidation设置为true ,将出现以下错误:

回发或callback参数无效。 事件validation在configuration中启用,或者在页面中使用<%@ Page EnableEventValidation =“true”%>。 为了安全起见,此functionvalidation回发或callback事件的参数来自最初呈现它们的服务器控件。 如果数据是有效的和预期的,请使用ClientScriptManager.RegisterForEventValidation方法为了注册回发或callback数据进行validation。

您必须在每次回发中添加此内容,而不仅限于数据绑定。 因此,您应该使用GridView的RowCreated -Event 。

例如

(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 

而不是在RowCreated上做,你可以在Render()上做。 这样你可以使用GetPostBackClientHyperlink的重载与真正的registerForEventValidation并避免“无效回发/callback参数”的错误。

像这样的东西:

 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> 

试试这个在网格中添加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 Grid Databinding。

尝试在ASPX代码中的<tr> <asp:LinkButton>周围使用<asp:LinkButton> ,设置LinkBut​​ton的CommandName='Select'并在item命令事件中处理该命令并设置选定行的样式!