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


扩展GridView控件(3) - 根据按钮的CommandName设置其客户端属性


作者: webabcd
InBlock.gif /*正式版的实现 开始*/
 
介绍
扩展GridView控件:
根据按钮的CommandName设置其客户端属性

使用方法(设置ClientButtons集合属性):
BoundCommandName - 需要绑定的CommandName
AttributeKey - 属性的名称
AttributeValue - 属性的值(两个占位符:{0} - CommandArgument;{1} - Text)
Position - 属性的值的位置


关键代码
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         /// 扩展功能:根据按钮的CommandName设置其客户端属性
InBlock.gif         /// </summary>
InBlock.gif         public class ClientButtonFunction : ExtendFunction
InBlock.gif        {
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 public ClientButtonFunction()
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 ClientButtonFunction(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                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// SmartGridView的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                         // TableCell里的每个Control
InBlock.gif                         foreach (Control c in tc.Controls)
InBlock.gif                        {
InBlock.gif                                 // 如果控件继承自接口IButtonControl
InBlock.gif                                 if (c is IButtonControl)
InBlock.gif                                {
InBlock.gif                                         // 从用户定义的ClientButtons集合中分解出ClientButton
InBlock.gif                                         foreach (ClientButton cb in this._sgv.ClientButtons)
InBlock.gif                                        {
InBlock.gif                                                 // 如果在ClientButtons中绑定了该按钮的CommandName
InBlock.gif                                                 if (((IButtonControl)c).CommandName == cb.BoundCommandName)
InBlock.gif                                                {
InBlock.gif                                                         // 替换占位符{0}-CommandArgument;{1}-Text
InBlock.gif                                                         string attributeValue =    
InBlock.gif                                                                String.Format(
InBlock.gif                                                                        cb.AttributeValue,
InBlock.gif                                                                        ((IButtonControl)c).CommandArgument,
InBlock.gif                                                                        ((IButtonControl)c).Text);
InBlock.gif                                                        
InBlock.gif                                                         // 设置按钮的客户端属性
InBlock.gif                                                        YYControls.Helper.Common.SetAttribute(
InBlock.gif                                                                (IAttributeAccessor)c,    
InBlock.gif                                                                cb.AttributeKey,    
InBlock.gif                                                                attributeValue,    
InBlock.gif                                                                cb.Position);
InBlock.gif
InBlock.gif                                                         break;
InBlock.gif                                                }
InBlock.gif                                        }
InBlock.gif                                }
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
InBlock.gif}
 
InBlock.gif /*正式版的实现 结束*/
 
InBlock.gif /*测试版的实现 开始*/
 
介绍
给按钮增加单击弹出确认框的功能是经常要用到的,我们一般是通过在RowDataBound事件里编码的方式实现,麻烦,所以扩展一下。


控件开发
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、新建一个ConfirmButton类,有两个属性
/// <summary>
InBlock.gif         /// ConfirmButton 的摘要说明。
InBlock.gif         /// </summary>
InBlock.gif        [ToolboxItem( false)]
InBlock.gif        [TypeConverter( typeof(ConfirmButtonConverter))]
InBlock.gif         public class ConfirmButton
InBlock.gif        {
InBlock.gif                 private string _commandName;
InBlock.gif                 /// <summary>
InBlock.gif                 /// 按钮的CommandName
InBlock.gif                 /// </summary>
InBlock.gif                 public string CommandName
InBlock.gif                {
InBlock.gif                        get { return this._commandName; }
InBlock.gif                        set { this._commandName = value; }
InBlock.gif                }
InBlock.gif
InBlock.gif                 private string _confirmMessage;
InBlock.gif                 /// <summary>
InBlock.gif                 /// 确认框弹出的信息
InBlock.gif                 /// </summary>
InBlock.gif                 public string ConfirmMessage
InBlock.gif                {
InBlock.gif                        get { return this._confirmMessage; }
InBlock.gif                        set { this._confirmMessage = value; }
InBlock.gif                }
InBlock.gif        }
 
3、新建一个继承自CollectionBase的类ConfirmButtons
/// <summary>
InBlock.gif         /// ProjectGroups 的摘要说明。
InBlock.gif         /// 注意要继承自CollectionBase
InBlock.gif         /// </summary>
InBlock.gif        [
InBlock.gif        ToolboxItem( false),
InBlock.gif        ParseChildren( true)
InBlock.gif        ]
InBlock.gif         public class ConfirmButtons : CollectionBase
InBlock.gif        {
InBlock.gif                 /// <summary>
InBlock.gif                 /// 构造函数
InBlock.gif                 /// </summary>
InBlock.gif                 public ConfirmButtons()
InBlock.gif                        : base()
InBlock.gif                {
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 实现IList接口
InBlock.gif                 /// 获取或设置指定索引处的元素。
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="index">要获得或设置的元素从零开始的索引</param>
InBlock.gif                 /// <returns></returns>
InBlock.gif                 public ConfirmButton this[ int index]
InBlock.gif                {
InBlock.gif                        get
InBlock.gif                        {
InBlock.gif                                 return (ConfirmButton) base.List[index];
InBlock.gif                        }
InBlock.gif                        set
InBlock.gif                        {
InBlock.gif                                 base.List[index] = (ConfirmButton)value;
InBlock.gif                        }
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 实现IList接口
InBlock.gif                 /// 将某项添加到 System.Collections.IList 中。
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="item">要添加到 System.Collections.IList 的 System.Object。</param>
InBlock.gif                 public void Add(ConfirmButton item)
InBlock.gif                {
InBlock.gif                         base.List.Add(item);
InBlock.gif                }
InBlock.gif
InBlock.gif                 /// <summary>
InBlock.gif                 /// 实现IList接口
InBlock.gif                 /// 从 System.Collections.IList 中移除特定对象的第一个匹配项。
InBlock.gif                 /// </summary>
InBlock.gif                 /// <param name="index">要从 System.Collections.IList 移除的 System.Object</param>
InBlock.gif                 public void Remove( int index)
InBlock.gif                {
InBlock.gif                         if (index > -1 && index < base.Count)
InBlock.gif                        {
InBlock.gif                                 base.List.RemoveAt(index);
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }