GridView控件数据行响应鼠标的单击和双击事件

为了让GridView的数据行可以响应鼠标的单击和双击事件,一般我们会在GridView的RowDataBound事件中给<tr>加上客户端代码,为了简化这个步骤,我们来扩展一下它。


控件开发
1、新建一个继承自GridView的类。
/**/ ///<summary>
///继承自GridView
///</summary>

[ToolboxData( @" <{0}:SmartGridViewrunat='server'></{0}:SmartGridView> " )]
public class SmartGridView:GridView
{
}

2、加两个属性,分别是单击行事件所对应的按钮的ID和双击行事件所对应的按钮的ID
private string _rowClickButtonID;
/**/ ///<summary>
///单击行事件所对应的按钮的ID
///</summary>

[Description( " 单击行事件所对应的按钮的ID " ),DefaultValue( "" ),Category( " 扩展 " )]
public virtual string RowClickButtonID
{
get{return_rowClickButtonID;}
set{_rowClickButtonID=value;}
}


private string _rowDoubleClickButtonID;
/**/ ///<summary>
///双击行事件所对应的按钮的ID
///</summary>

[Description( " 双击行事件所对应的按钮的ID " ),DefaultValue( "" ),Category( " 扩展 " )]
public virtual string RowDoubleClickButtonID
{
get{return_rowDoubleClickButtonID;}
set{_rowDoubleClickButtonID=value;}
}

3、新建一个JavaScriptConstant类,把我们要用到的javascript存在一个常量里
using System;
using System.Collections.Generic;
using System.Text;

namespace YYControls.SmartGridView
{
/**////<summary>
///javascript
///</summary>

publicclassJavaScriptConstant
{
internalconststringjsClickAndDoubleClick=@"<scripttype=""text/javascript"">
//<![CDATA[
varisDoubleClick=false;
functionyy_RowClick(id)
{
setTimeout(""yy_RowClickTimeout('""+id+""')"",300);
}
functionyy_RowClickTimeout(id)
{
if(isDoubleClick==false)
{
//执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick=true;
}
functionyy_RowDoubleClick(id)
{
if(isDoubleClick==true)
{
//执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick=true;
}
//]]>
</script>
";
}

}


4、重写OnPreRender方法,注册上面那段客户端脚本
/**/ ///<summary>
///OnPreRender
///</summary>
///<paramname="e"></param>

protected override void OnPreRender(EventArgse)
{
base.OnPreRender(e);

if(!String.IsNullOrEmpty(RowClickButtonID)||!String.IsNullOrEmpty(RowDoubleClickButtonID))
{
if(!Page.ClientScript.IsClientScriptBlockRegistered("jsClickAndDoubleClick"))
{
Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
"jsClickAndDoubleClick",JavaScriptConstant.jsClickAndDoubleClick
);
}

}

}


5、重写OnRowDataBound以实现数据行响应鼠标的单击和双击事件的功能。主要是给<tr>加上客户端代码,用来调用某个按钮的click事件
/**/ ///<summary>
///OnRowDataBound
///</summary>
///<paramname="e"></param>

protected override void OnRowDataBound(GridViewRowEventArgse)
{
if(e.Row.RowType==DataControlRowType.DataRow)
{
if(!String.IsNullOrEmpty(RowClickButtonID)||!String.IsNullOrEmpty(RowDoubleClickButtonID))
{
//GridViewRow的每个TableCell
foreach(TableCelltcine.Row.Cells)
{
//TableCell里的每个Control
foreach(Controlcintc.Controls)
{
//如果控件继承自接口IButtonControl
if(c.GetType().GetInterface("IButtonControl")!=null&&c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))
{
if(!String.IsNullOrEmpty(RowClickButtonID))
{
//该按钮的ID等于单击行所对应的按钮ID
if(c.ID==RowClickButtonID)
{
//增加行的单击事件,调用客户端脚本,根据所对应按钮的ID执行所对应按钮的click事件
e.Row.Attributes.Add("onclick","javascript:yy_RowClick('"+c.ClientID+"')");
}

}


if(!String.IsNullOrEmpty(RowDoubleClickButtonID))
{
//该按钮的ID等于双击行所对应的按钮ID
if(c.ID==RowDoubleClickButtonID)
{
//增加行的双击事件,调用客户端脚本,根据所对应按钮的ID执行所对应按钮的click事件
e.Row.Attributes.Add("ondblclick","javascript:yy_RowDoubleClick('"+c.ClientID+"')");
}

}

}

}

}

}

}


base.OnRowDataBound(e);
}



控件使用
添加这个控件到工具箱里,然后拖拽到webform上,要实现行的单击事件则设置RowClickButtonID为行单击事件所对应的按钮的ID,要实现行的双击事件则设置RowDoubleClickButtonID为行双击事件所对应的按钮的ID。
ObjData.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.ComponentModel;

/**/ ///<summary>
///OjbData的摘要说明
///</summary>

public class OjbData
{
publicOjbData()
{
//
//TODO:在此处添加构造函数逻辑
//
}


[DataObjectMethod(DataObjectMethodType.Select,
true)]
publicDataTableSelect()
{
DataTabledt
=newDataTable();
dt.Columns.Add(
"no",typeof(string));
dt.Columns.Add(
"name",typeof(string));

for(inti=0;i<30;i++)
{
DataRowdr
=dt.NewRow();
dr[
0]="no"+i.ToString().PadLeft(2,'0');
dr[
1]="name"+i.ToString().PadLeft(2,'0');

dt.Rows.Add(dr);
}


returndt;
}

}


Default.aspx
<% @PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default" %>

<! DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > SmartGridView测试 </ title >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单击 GridView 控件中的按钮时,将引发 RowCommand 事件GridView 控件具有内置功能,用于进编辑、删除和分页等操作。 还可以添加按钮并使用 RowCommand 事件控件添加自定义功能。 可以通过下面的方式向 GridView 控件添加自定义功能: 向 GridView 控件添加 ButtonField 字段。 向 GridView 控件中的模板添加 Button、LinkButton 或 ImageButton 控件。 可以使用事件参数的 CommandName 属性在事件处理程序方法中标识按钮的功能。 如果使用的是 ButtonField 或 TemplateField 对象,则还可以使用 CommandArgument 属性来标识当前。 使用的是 ButtonField 对象时,CommandArgument 属性自动设置为索引。 使用的是 TemplateField 对象时,控件不会自动设置 CommandArgument 属性。 在这种情况下,如果必须在事件处理程序中确定索引,则可以使用数据绑定表达式将该按钮的 CommandArgument 属性设置为索引。 响应 GridView 控件中的按钮事件 将按钮的 CommandName 属性设置为标识其功能的字符串,如“打印”或“复制”。 如果使用的是 TemplateField 对象并且必须在事件处理程序方法中访问索引,则将按钮的 CommandArgument 属性设置为标识当前的表达式。 下面的示例演示如何将 TemplateField 列中某个按钮的 CommandArgument 属性设置为当前索引。 在该示例中,该列包含一个显示购物车的 Button 控件。 VBC#C++F#JScript 复制不支持该语言或没有可用的代码示例。 VBC#C++F#JScript 复制 <asp:Button ID="AddButton" runat="server" CommandName="AddToCart" CommandArgument="" Text="Add to Cart" /> 为 GridView 控件的 RowCommand 事件创建一个方法。 在该方法中,执下列操作: 检查事件参数对象的 CommandName 属性来查看传入什么字符串。 如果需要,使用 CommandArgument 属性检索包含该按钮的的索引。 为用户单击的按钮执相应的逻辑。 下面的示例演示响应 GridView 控件中的按钮单击的方法。 在该示例中,TemplateField 列中的按钮发送命令“AddToCart”。 RowCommand 事件处理程序确定被单击的按钮。 如果被单击的是购物车按钮,则代码执相应的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值