在gridview中使整行可单击

时间:2009-03-26 15:19:36

标签: c# asp.net gridview

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

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

6 个答案:

答案 0 :(得分:16)

这是我之前准备的内容:


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

然后挂钩标准行命令事件......

答案 1 :(得分:1)

为了实现这一目标,需要进行一些JavaScript编程。

基本上你将不得不处理行的click事件(有些浏览器行没有click事件,所以你可能需要处理tds的click事件...时间投资ajax框架!)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

查看Teemu的this article,在那里他解释了如何点击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#。

答案 5 :(得分:0)

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

LinkBut​​ton还有一个CommandArgument,其中包含当前行号和OnCommand事件,可以处理实际点击。

<asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Container.DataItemIndex %>' OnCommand="LinkButton1_Command"></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

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
}