目标:
我们要实现 鼠标在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告诉后台。