扩展GridView控件(6) - 响应行的单击事件和双击事件
2007-01-22 08:42
459 查看
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]
[align=center]扩展GridView控件(6) - 响应行的单击事件和双击事件
[/align]
作者:webabcd
/*正式版的实现 开始*/
介绍
扩展GridView控件:
响应行的单击事件和双击事件,并在服务端处理
使用方法(设置属性):
BoundRowClickCommandName - 行的单击事件需要绑定的CommandName
BoundRowDoubleClickCommandName - 行的双击事件需要绑定的CommandName
关键代码
单击
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace YYControls.SmartGridViewFunction
{
/// <summary>
/// 扩展功能:响应行的单击事件
/// </summary>
public class RowClickFunction : ExtendFunction
{
List<string> _rowClickButtonUniqueIdList = new List<string>();
/// <summary>
/// 构造函数
/// </summary>
public RowClickFunction()
: base()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sgv">SmartGridView对象</param>
public RowClickFunction(SmartGridView sgv)
: base(sgv)
{
}
/// <summary>
/// 扩展功能的实现
/// </summary>
protected override void Execute()
{
this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
}
/// <summary>
/// RowDataBoundCell
/// </summary>
/// <param name="sender"></param>
/// <param name="gvtc"></param>
void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)
{
TableCell tc = gvtc.TableCell;
foreach (Control c in tc.Controls)
{
IButtonControl ibc = c as IButtonControl;
if (ibc != null && this._sgv.BoundRowClickCommandName == ibc.CommandName)
{
// 300毫秒后响应单击事件的脚本(避免和双击事件冲突)
string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
js = js.Insert(11, "setTimeout(\"");
js += "\", 300)";
GridViewRow gvr = tc.Parent as GridViewRow;
Helper.Common.SetAttribute(gvr, "onclick", js, AttributeValuePosition.Last);
_rowClickButtonUniqueIdList.Add(c.UniqueID);
}
}
}
/// <summary>
/// RenderBegin
/// </summary>
/// <param name="sender"></param>
/// <param name="writer"></param>
void _sgv_RenderBegin(object sender, HtmlTextWriter writer)
{
foreach (string uniqueId in this._rowClickButtonUniqueIdList)
{
// 注册回发或回调数据以进行验证
this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
}
}
}
}
双击
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace YYControls.SmartGridViewFunction
{
/// <summary>
/// 扩展功能:响应行的双击事件
/// </summary>
public class RowDoubleClickFunction : ExtendFunction
{
List<string> _rowDoubleClickButtonUniqueIdList = new List<string>();
/// <summary>
/// 构造函数
/// </summary>
public RowDoubleClickFunction()
: base()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sgv">SmartGridView对象</param>
public RowDoubleClickFunction(SmartGridView sgv)
: base(sgv)
{
}
/// <summary>
/// 扩展功能的实现
/// </summary>
protected override void Execute()
{
this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
}
/// <summary>
/// RowDataBoundCell
/// </summary>
/// <param name="sender"></param>
/// <param name="gvtc"></param>
void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)
{
TableCell tc = gvtc.TableCell;
foreach (Control c in tc.Controls)
{
IButtonControl ibc = c as IButtonControl;
if (ibc != null && this._sgv.BoundRowDoubleClickCommandName == ibc.CommandName)
{
// 响应双击事件的脚本
string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
GridViewRow gvr = tc.Parent as GridViewRow;
Helper.Common.SetAttribute(gvr, "ondblclick", js, AttributeValuePosition.Last);
_rowDoubleClickButtonUniqueIdList.Add(c.UniqueID);
}
}
}
/// <summary>
/// RenderBegin
/// </summary>
/// <param name="sender"></param>
/// <param name="writer"></param>
void _sgv_RenderBegin(object sender, HtmlTextWriter writer)
{
foreach (string uniqueId in this._rowDoubleClickButtonUniqueIdList)
{
// 注册回发或回调数据以进行验证
this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
}
}
}
}
/*正式版的实现 结束*/
/*测试版的实现 开始*/
介绍
为了让GridView的数据行可以响应鼠标的单击和双击事件,一般我们会在GridView的RowDataBound事件中给<tr>加上客户端代码,为了简化这个步骤,我们来扩展一下它。
控件开发
1、新建一个继承自GridView的类。
/// <summary>
/// 继承自GridView
/// </summary>
[ToolboxData(@"<{0}:SmartGridView runat='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>
public class JavaScriptConstant
{
internal const string jsClickAndDoubleClick = @"<script type=""text/javascript"">
//<![CDATA[
var isDoubleClick = false;
function yy_RowClick(id)
{
setTimeout(""yy_RowClickTimeout('""+id+""')"", 300);
}
function yy_RowClickTimeout(id)
{
if (isDoubleClick == false)
{
// 执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick = true;
}
function yy_RowDoubleClick(id)
{
if (isDoubleClick == true)
{
// 执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick = true;
}
//]]>
</script>";
}
}
未完待续>>
[索引页]
[源码下载]
[align=center]扩展GridView控件(6) - 响应行的单击事件和双击事件
[/align]
作者:webabcd
/*正式版的实现 开始*/
介绍
扩展GridView控件:
响应行的单击事件和双击事件,并在服务端处理
使用方法(设置属性):
BoundRowClickCommandName - 行的单击事件需要绑定的CommandName
BoundRowDoubleClickCommandName - 行的双击事件需要绑定的CommandName
关键代码
单击
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace YYControls.SmartGridViewFunction
{
/// <summary>
/// 扩展功能:响应行的单击事件
/// </summary>
public class RowClickFunction : ExtendFunction
{
List<string> _rowClickButtonUniqueIdList = new List<string>();
/// <summary>
/// 构造函数
/// </summary>
public RowClickFunction()
: base()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sgv">SmartGridView对象</param>
public RowClickFunction(SmartGridView sgv)
: base(sgv)
{
}
/// <summary>
/// 扩展功能的实现
/// </summary>
protected override void Execute()
{
this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
}
/// <summary>
/// RowDataBoundCell
/// </summary>
/// <param name="sender"></param>
/// <param name="gvtc"></param>
void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)
{
TableCell tc = gvtc.TableCell;
foreach (Control c in tc.Controls)
{
IButtonControl ibc = c as IButtonControl;
if (ibc != null && this._sgv.BoundRowClickCommandName == ibc.CommandName)
{
// 300毫秒后响应单击事件的脚本(避免和双击事件冲突)
string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
js = js.Insert(11, "setTimeout(\"");
js += "\", 300)";
GridViewRow gvr = tc.Parent as GridViewRow;
Helper.Common.SetAttribute(gvr, "onclick", js, AttributeValuePosition.Last);
_rowClickButtonUniqueIdList.Add(c.UniqueID);
}
}
}
/// <summary>
/// RenderBegin
/// </summary>
/// <param name="sender"></param>
/// <param name="writer"></param>
void _sgv_RenderBegin(object sender, HtmlTextWriter writer)
{
foreach (string uniqueId in this._rowClickButtonUniqueIdList)
{
// 注册回发或回调数据以进行验证
this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
}
}
}
}
双击
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace YYControls.SmartGridViewFunction
{
/// <summary>
/// 扩展功能:响应行的双击事件
/// </summary>
public class RowDoubleClickFunction : ExtendFunction
{
List<string> _rowDoubleClickButtonUniqueIdList = new List<string>();
/// <summary>
/// 构造函数
/// </summary>
public RowDoubleClickFunction()
: base()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sgv">SmartGridView对象</param>
public RowDoubleClickFunction(SmartGridView sgv)
: base(sgv)
{
}
/// <summary>
/// 扩展功能的实现
/// </summary>
protected override void Execute()
{
this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
}
/// <summary>
/// RowDataBoundCell
/// </summary>
/// <param name="sender"></param>
/// <param name="gvtc"></param>
void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)
{
TableCell tc = gvtc.TableCell;
foreach (Control c in tc.Controls)
{
IButtonControl ibc = c as IButtonControl;
if (ibc != null && this._sgv.BoundRowDoubleClickCommandName == ibc.CommandName)
{
// 响应双击事件的脚本
string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
GridViewRow gvr = tc.Parent as GridViewRow;
Helper.Common.SetAttribute(gvr, "ondblclick", js, AttributeValuePosition.Last);
_rowDoubleClickButtonUniqueIdList.Add(c.UniqueID);
}
}
}
/// <summary>
/// RenderBegin
/// </summary>
/// <param name="sender"></param>
/// <param name="writer"></param>
void _sgv_RenderBegin(object sender, HtmlTextWriter writer)
{
foreach (string uniqueId in this._rowDoubleClickButtonUniqueIdList)
{
// 注册回发或回调数据以进行验证
this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
}
}
}
}
/*正式版的实现 结束*/
/*测试版的实现 开始*/
介绍
为了让GridView的数据行可以响应鼠标的单击和双击事件,一般我们会在GridView的RowDataBound事件中给<tr>加上客户端代码,为了简化这个步骤,我们来扩展一下它。
控件开发
1、新建一个继承自GridView的类。
/// <summary>
/// 继承自GridView
/// </summary>
[ToolboxData(@"<{0}:SmartGridView runat='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>
public class JavaScriptConstant
{
internal const string jsClickAndDoubleClick = @"<script type=""text/javascript"">
//<![CDATA[
var isDoubleClick = false;
function yy_RowClick(id)
{
setTimeout(""yy_RowClickTimeout('""+id+""')"", 300);
}
function yy_RowClickTimeout(id)
{
if (isDoubleClick == false)
{
// 执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick = true;
}
function yy_RowDoubleClick(id)
{
if (isDoubleClick == true)
{
// 执行ID所指按钮的click事件
document.getElementById(id).click();
}
isDoubleClick = true;
}
//]]>
</script>";
}
}
未完待续>>
相关文章推荐
- 扩展GridView控件(6) - 响应行的单击事件和双击事件
- 扩展GridView控件(6) - 响应行的单击事件和双击事件
- 扩展GridView控件(6) - 响应行的单击事件和双击事件
- 扩展GridView控件(6) - 响应行的单击事件和双击事件
- 上接扩展GridView控件(6) - 响应行的单击事件和双击事件
- GridView控件(六)—数据行响应鼠标的单击和双击事件
- 扩展GridView(六)——数据行响应鼠标的单击和双击事件
- 支持行单击、双击事件的GridView和DataList控件(译)
- ios中控件同时响应单击和双击事件以及多击事件
- gridview绑定checkbox控件后,通过单击CheckedChanged事件获取当前选择行的数据
- ASPxGridView1单击,双击事件
- mfc 中静态控件static 的双击响应事件
- GridView 行单击或双击事件绑定
- 控件的单击事件和双击事件
- 扩展GridView控件(0) - 基本架构、增加事件和要点汇总
- 090906(星期天)项目进展:添加CTreeView控件对双击事件的响应
- 响应双击picture控件的事件
- ASP.NET DEMO15_1: GridView 行单击与双击事件2
- ASP.NET DEMO 15: 同时支持行单击和双击事件的 GridView/DataGrid
- 如何:响应 GridView 控件中的按钮事件