asp.net实现 gridview 鼠标单击任意字段选中一行 ,并获取数据

目标:

我们要实现 鼠标在gridview上单击任意字段就选中一行,并获取该行数据

步骤:

1.创建gridview(起名GV_1),在GV_1中创建LinkButton(起名lbtnSelected),将CommandName设为alarmLinkButton

                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="lbtnSelected" runat="server" CommandName="alarmLinkButton" 
                            ShowSelectButton="False" />
                    </ItemTemplate>
                </asp:TemplateField>
2.在前台创建JS事件。该Js事件,当鼠标单击某行后触发

        <script language="javascript">
        		          function ButtonClickEvent(cid) {
        	                         var btn = document.getElementById(cid);
           		          if (btn != null) {
                	                     btn.click();
           	                 }
       	                         }
    		        </script>


  3.在GV_1的RowDataBound事件中创建如下代码:

	protected void GV_1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {    
                e.Row.Attributes.Add("onclick", "ButtonClickEvent('" + e.Row.FindControl("lbtnSelected").ClientID + "')");//为每行添加刚刚写的JS单击事件

                ((LinkButton)e.Row.FindControl("lbtnSelected")).CommandArgument = e.Row.RowIndex.ToString();//获取当前行号,用CommandArgument记录该数据 

            }
        }
4.在GV_1的RowCommand事件中加如下代码。JS中的click事件会触发该事件


protected void GV_1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "alarmLinkButton")
            {
                GridViewRow row = null;
                System.Reflection.FieldInfo fRow = e.GetType().GetField("_row", BindingFlags.Instance | BindingFlags.NonPublic);
                row = fRow.GetValue(e) as GridViewRow;//该方法获取非公共成员变量
                if (row != null)
                {
                   //这里进行你要的操作,可以对获取的row数据进行使用
                }
                //GV_1.SelectedIndex = int.Parse(e.CommandArgument.ToString());//你也可以利用刚刚获取的行号进行你要的操作(CommandArgument里的数据是自定义的备选参数,在这里我们加入的是行号rowindex)
            }
        }

PS:在上面的RowComman事件中,我们用特殊手法获取了行的整条数据。关于如何获取非公共成员变量:http://blog.csdn.net/yueguangzhiyuan/article/details/8926131



深入:

总结刚刚的步骤,你可能不难发现,我们为了实现目标进行了复杂的处理。

整个流程大概是这样:鼠标单击一个Row》触发该Row的JS所写的onclick事件》触发该行LinkButton单击事件(每行都有一个LinkButton)》触发Gridview的RowCommand事件》获取行的数据

为什么绕这么一大圈?

因为:

有前后台之分。我们要从前台告诉后台,我选中了一行,本身很简单。但是可惜的是在ASp.Net里除非用Gridview的GenerateSelectButton,不然很难。但是用它的话,我们必须单击“选中”这个字段才能实现选中行。所以只能利用JS告诉后台。



posted @ 2013-06-03 16:50  Hi-Jimmy  阅读(141)  评论(0编辑  收藏  举报