在gridview中使整行可单击

我有一个gridview,我需要在单击一行时触发事件。

是否存在我需要绑定的现有GridView事件才能实现此目的?

这是我之前准备的东西:

public class RowClickableGridView : GridView { public Style HoverRowStyle { get { return ViewState["HoverRowStyle"] as Style; } set { ViewState["HoverRowStyle"] = value; } } public bool EnableRowClickSelection { get { return ViewState["EnableRowClickSelection"] as bool? ?? true; } set { ViewState["EnableRowClickSelection"] = value; } } public string RowClickCommand { get { return ViewState["RowClickCommand"] as string ?? "Select"; } set { ViewState["RowClickCommand"] = value; } } public string RowToolTip { get { if (!RowToolTipSet) return string.Format("Click to {0} row", RowClickCommand.ToLowerInvariant()); return ViewState["RowToolTip"] as string; } set { ViewState["RowToolTip"] = value; RowToolTipSet = true; } } private bool RowToolTipSet { get { return ViewState["RowToolTipSet"] as bool? ?? false; } set { ViewState["RowToolTipSet"] = value; } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); foreach (GridViewRow row in Rows) { if (row.RowType != DataControlRowType.DataRow) continue; if (EnableRowClickSelection && row.RowIndex != SelectedIndex && row.RowIndex != EditIndex) { if (string.IsNullOrEmpty(row.ToolTip)) row.ToolTip = RowToolTip; row.Style[HtmlTextWriterStyle.Cursor] = "pointer"; PostBackOptions postBackOptions = new PostBackOptions(this, string.Format("{0}${1}", RowClickCommand, row.RowIndex)); postBackOptions.PerformValidation = true; row.Attributes["onclick"] = Page.ClientScript.GetPostBackEventReference(postBackOptions); foreach (TableCell cell in row.Cells) { foreach (Control control in cell.Controls) { const string clientClick = "event.cancelBubble = true;{0}"; WebControl webControl = control as WebControl; if (webControl == null) continue; webControl.Style[HtmlTextWriterStyle.Cursor] = "Auto"; Button button = webControl as Button; if (button != null) { button.OnClientClick = string.Format(clientClick, button.OnClientClick); continue; } ImageButton imageButton = webControl as ImageButton; if (imageButton != null) { imageButton.OnClientClick = string.Format(clientClick, imageButton.OnClientClick); continue; } LinkButton linkButton = webControl as LinkButton; if (linkButton != null) { linkButton.OnClientClick = string.Format(clientClick, linkButton.OnClientClick); continue; } webControl.Attributes["onclick"] = string.Format(clientClick, string.Empty); } } } if (HoverRowStyle == null) continue; if (row.RowIndex != SelectedIndex && row.RowIndex != EditIndex) { row.Attributes["onmouseover"] = string.Format("this.className='{0}';", HoverRowStyle.CssClass); row.Attributes["onmouseout"] = string.Format("this.className='{0}';", row.RowIndex%2 == 0 ? RowStyle.CssClass : AlternatingRowStyle.CssClass); } else { row.Attributes.Remove("onmouseover"); row.Attributes.Remove("onmouseout"); } } } protected override void Render(HtmlTextWriter writer) { base.Render(writer); foreach (GridViewRow row in Rows) { if (row.RowType == DataControlRowType.DataRow) { Page.ClientScript.RegisterForEventValidation(row.ClientID); } } } } 

然后你挂钩标准行命令事件……

为了实现这一点,将需要一些JavaScript编程。

基本上你将不得不处理行的click事件(有些浏览器行没有click事件,因此你可能必须处理tds的click事件……投资ajax框架的时间!)

然后,您将从javascript必须以行索引作为参数触发回发。 有关如何执行此操作,请参阅encosia(ASP.Net的一个很棒的站点 – ajax实现)。 以下是这些文章的链接

没有现有事件可以处理整行行。 最好的办法是让一些javascript(可能是通过ASP.NET Ajax)检测点击并自己激活事件。 或者,您必须创建用户选择的按钮或复选框。

您需要处理“SelectedIndexChanged”事件,然后可以在网格中查询.SelectedRow。 Alternativley使用“SelectedIndexChanging”事件设置“e.NewSelectedIndex”

查看Teemu 撰写的这篇文章 ,在那里他解释了如何在Gridview中单击一行并抛出RowClicked事件。

以下是代码的摘录:

 Protected Overrides Sub RaisePostBackEvent(ByVal eventArgument As String) If eventArgument.StartsWith("rc") Then Dim index As Integer = Int32.Parse(eventArgument.Substring(2)) Dim args As New GridViewRowClickedEventArgs(Me.Rows(index)) OnRowClicked(args) Else MyBase.RaisePostBackEvent(eventArgument) End If End Sub Public Class GridViewRowClickedEventArgs Inherits EventArgs Private _row As GridViewRow Public Sub New(ByVal row As GridViewRow) _row = row End Sub Public ReadOnly Property Row() As GridViewRow Get Return _row End Get End Property End Class 

顺便说一句,它在VB而不是C#中。

这可以通过向GridView添加一个没有Text的虚拟LinkButtonRowDataBound一些代码来轻松完成。 页面上需要LinkBut​​ton以避免Invalid postback or callback argument错误。 将可见性设置为false也会导致此错误。

LinkBut​​ton还有一个带有当前行号的CommandArgument和一个用于处理实际点击的OnCommand事件。

      

OnRowDataBound方法

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { //check if the row is a datarow if (e.Row.RowType == DataControlRowType.DataRow) { //find the linkbutton with findcontrol and cast it back to one LinkButton lb = e.Row.FindControl("LinkButton1") as LinkButton; //create the correct postback event with the UniqueID property of the linkbutton string href = "javascript:__doPostBack('" + lb.UniqueID + "','')"; //add the onclick event with the correct href to the row e.Row.Attributes.Add("onclick", href); //to make it visible to the user that the row can be clicked e.Row.Attributes.Add("style", "cursor:pointer;"); } } 

还有Command方法,你可以从LinkBut​​ton获取CommandArgument并用它做各种巧妙的事情。

 protected void LinkButton1_Command(object sender, CommandEventArgs e) { //the row index of the clicked row from the grid if needed int rowIndex = Convert.ToInt32(e.CommandArgument); //do stuff }