GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[×××]


扩展GridView控件(6) - 响应行的单击事件和双击事件


作者: webabcd

InBlock.gif /*正式版的实现 开始*/
 
介绍
扩展GridView控件:
响应行的单击事件和双击事件,并在服务端处理

使用方法(设置属性):
BoundRowClickCommandName - 行的单击事件需要绑定的CommandName
BoundRowDoubleClickCommandName - 行的双击事件需要绑定的CommandName


关键代码
单击
InBlock.gif using System;
InBlock.gif using System.Collections.Generic;
InBlock.gif using System.Text;
InBlock.gif
InBlock.gif using System.Web.UI.WebControls;
InBlock.gif using System.Web.UI;
InBlock.gif
InBlock.gif namespace YYControls.SmartGridViewFunction
InBlock.gif{
InBlock.gif         /// <summary>
InBlock.gif         /// 扩展功能:响应行的单击事件
InBlock.gif         /// </summary>
InBlock.gif         public class RowClickFunction : ExtendFunction
InBlock.gif        {
InBlock.gif                List< string> _rowClickButtonUniqueIdList = new List< string>();
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 public RowClickFunction()
InBlock.gif                        : base()
InBlock.gif                {
InBlock.gif
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sgv">SmartGridView对象</param>
InBlock.gif                 public RowClickFunction(SmartGridView sgv)
InBlock.gif                        : base(sgv)
InBlock.gif                {
InBlock.gif
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 扩展功能的实现
InBlock.gif                 /// </summary>
InBlock.gif                 protected override void Execute()
InBlock.gif                {
InBlock.gif                         this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
InBlock.gif                         this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// RowDataBoundCell
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sender"></param>
InBlock.gif                 /// <param name="gvtc"></param>
InBlock.gif                 void _sgv_RowDataBoundCell( object sender, GridViewTableCell gvtc)
InBlock.gif                {
InBlock.gif                        TableCell tc = gvtc.TableCell;
InBlock.gif
InBlock.gif                         foreach (Control c in tc.Controls)
InBlock.gif                        {
InBlock.gif                                IButtonControl ibc = c as IButtonControl;
InBlock.gif
InBlock.gif                                 if (ibc != null && this._sgv.BoundRowClickCommandName == ibc.CommandName)
InBlock.gif                                {
InBlock.gif                                         // 300毫秒后响应单击事件的脚本(避免和双击事件冲突)
InBlock.gif                                         string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
InBlock.gif                                        js = js.Insert(11, "setTimeout(\"");
InBlock.gif                                        js += "\", 300)";
InBlock.gif
InBlock.gif                                        GridViewRow gvr = tc.Parent as GridViewRow;
InBlock.gif                                        Helper.Common.SetAttribute(gvr, "onclick", js, AttributeValuePosition.Last);
InBlock.gif
InBlock.gif                                        _rowClickButtonUniqueIdList.Add(c.UniqueID);
InBlock.gif                                }
InBlock.gif                        }
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// RenderBegin
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sender"></param>
InBlock.gif                 /// <param name="writer"></param>
InBlock.gif                 void _sgv_RenderBegin( object sender, HtmlTextWriter writer)
InBlock.gif                {
InBlock.gif                         foreach ( string uniqueId in this._rowClickButtonUniqueIdList)
InBlock.gif                        {
InBlock.gif                                 // 注册回发或回调数据以进行验证
InBlock.gif                                 this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
InBlock.gif}
 
双击
InBlock.gif using System;
InBlock.gif using System.Collections.Generic;
InBlock.gif using System.Text;
InBlock.gif
InBlock.gif using System.Web.UI.WebControls;
InBlock.gif using System.Web.UI;
InBlock.gif
InBlock.gif namespace YYControls.SmartGridViewFunction
InBlock.gif{
InBlock.gif         /// <summary>
InBlock.gif         /// 扩展功能:响应行的双击事件
InBlock.gif         /// </summary>
InBlock.gif         public class RowDoubleClickFunction : ExtendFunction
InBlock.gif        {
InBlock.gif                List< string> _rowDoubleClickButtonUniqueIdList = new List< string>();
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 public RowDoubleClickFunction()
InBlock.gif                        : base()
InBlock.gif                {
InBlock.gif
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sgv">SmartGridView对象</param>
InBlock.gif                 public RowDoubleClickFunction(SmartGridView sgv)
InBlock.gif                        : base(sgv)
InBlock.gif                {
InBlock.gif
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 扩展功能的实现
InBlock.gif                 /// </summary>
InBlock.gif                 protected override void Execute()
InBlock.gif                {
InBlock.gif                         this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
InBlock.gif                         this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// RowDataBoundCell
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sender"></param>
InBlock.gif                 /// <param name="gvtc"></param>
InBlock.gif                 void _sgv_RowDataBoundCell( object sender, GridViewTableCell gvtc)
InBlock.gif                {
InBlock.gif                        TableCell tc = gvtc.TableCell;
InBlock.gif
InBlock.gif                         foreach (Control c in tc.Controls)
InBlock.gif                        {
InBlock.gif                                IButtonControl ibc = c as IButtonControl;
InBlock.gif
InBlock.gif                                 if (ibc != null && this._sgv.BoundRowDoubleClickCommandName == ibc.CommandName)
InBlock.gif                                {
InBlock.gif                                         // 响应双击事件的脚本
InBlock.gif                                         string js = this._sgv.Page.ClientScript.GetPostBackClientHyperlink(c, "");
InBlock.gif
InBlock.gif                                        GridViewRow gvr = tc.Parent as GridViewRow;
InBlock.gif                                        Helper.Common.SetAttribute(gvr, "ondblclick", js, AttributeValuePosition.Last);
InBlock.gif
InBlock.gif                                        _rowDoubleClickButtonUniqueIdList.Add(c.UniqueID);
InBlock.gif                                }
InBlock.gif                        }
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// RenderBegin
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="sender"></param>
InBlock.gif                 /// <param name="writer"></param>
InBlock.gif                 void _sgv_RenderBegin( object sender, HtmlTextWriter writer)
InBlock.gif                {
InBlock.gif                         foreach ( string uniqueId in this._rowDoubleClickButtonUniqueIdList)
InBlock.gif                        {
InBlock.gif                                 // 注册回发或回调数据以进行验证
InBlock.gif                                 this._sgv.Page.ClientScript.RegisterForEventValidation(uniqueId);
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
InBlock.gif}
 
InBlock.gif /*正式版的实现 结束*/
 
InBlock.gif /*测试版的实现 开始*/
 
介绍
为了让GridView的数据行可以响应鼠标的单击和双击事件,一般我们会在GridView的RowDataBound事件中给<tr>加上客户端代码,为了简化这个步骤,我们来扩展一下它。


控件开发
1、新建一个继承自GridView的类。
/// <summary>
/// 继承自GridView
/// </summary>
InBlock.gif[ToolboxData( @"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")]
InBlock.gif public class SmartGridView : GridView
InBlock.gif{
InBlock.gif}
 
2、加两个属性,分别是单击行事件所对应的按钮的ID和双击行事件所对应的按钮的ID
InBlock.gif private string _rowClickButtonID;
InBlock.gif                 /// <summary>
InBlock.gif                 /// 单击行事件所对应的按钮的ID
InBlock.gif                 /// </summary>
InBlock.gif                [Description( "单击行事件所对应的按钮的ID"), DefaultValue( ""), Category("扩展")]
InBlock.gif                 public virtual string RowClickButtonID
InBlock.gif                {
InBlock.gif                        get { return _rowClickButtonID; }
InBlock.gif                        set { _rowClickButtonID = value; }
InBlock.gif                }
InBlock.gif
InBlock.gif                 private string _rowDoubleClickButtonID;
InBlock.gif                 /// <summary>
InBlock.gif                 /// 双击行事件所对应的按钮的ID
InBlock.gif                 /// </summary>
InBlock.gif                [Description( "双击行事件所对应的按钮的ID"), DefaultValue( ""), Category("扩展")]
InBlock.gif                 public virtual string RowDoubleClickButtonID
InBlock.gif                {
InBlock.gif                        get { return _rowDoubleClickButtonID; }
InBlock.gif                        set { _rowDoubleClickButtonID = value; }
InBlock.gif                }
 
3、新建一个JavaScriptConstant类,把我们要用到的javascript存在一个常量里
InBlock.gif using System;
InBlock.gif using System.Collections.Generic;
InBlock.gif using System.Text;
InBlock.gif
InBlock.gif namespace YYControls.SmartGridView
InBlock.gif{
InBlock.gif         /// <summary>
InBlock.gif         /// javascript
InBlock.gif         /// </summary>
InBlock.gif         public class JavaScriptConstant
InBlock.gif        {
InBlock.gif                 internal const string jsClickAndDoubleClick = @"<script type=""text/javascript"">
InBlock.gif                 //<![CDATA[
InBlock.gif                var isDoubleClick = false;
InBlock.gif                function yy_RowClick(id)
InBlock.gif                {
InBlock.gif                        setTimeout( ""yy_RowClickTimeout('""+id+ ""')"", 300);
InBlock.gif                }
InBlock.gif                function yy_RowClickTimeout(id)
InBlock.gif                {
InBlock.gif                         if (isDoubleClick == false)
InBlock.gif                        {
InBlock.gif                                 // 执行ID所指按钮的click事件
InBlock.gif                                document.getElementById(id).click();
InBlock.gif                        }
InBlock.gif                        isDoubleClick = true;
InBlock.gif                }
InBlock.gif                function yy_RowDoubleClick(id)
InBlock.gif                {
InBlock.gif                         if (isDoubleClick == true)
InBlock.gif                        {
InBlock.gif                                 // 执行ID所指按钮的click事件
InBlock.gif                                document.getElementById(id).click();
InBlock.gif                        }
InBlock.gif                        isDoubleClick = true;
InBlock.gif                }
InBlock.gif                 //]]>
InBlock.gif                </script>";
InBlock.gif        }
InBlock.gif}