GridView控件——单击命令按钮弹出确认框

介绍
给按钮增加单击弹出确认框的功能是经常要用到的,我们一般是通过在RowDataBound事件里编码的方式实现,麻烦,所以扩展一下。


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

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

2、新建一个ConfirmButton类,有两个属性
     /// <summary>
    
/// ConfirmButton 的摘要说明。
    
/// </summary>

    [ToolboxItem( false )]
    [TypeConverter(
typeof (ConfirmButtonConverter))]
    
public   class  ConfirmButton
    
{
        
private string _commandName;
        
/// <summary>
        
/// 按钮的CommandName
        
/// </summary>

        public string CommandName
        
{
            
get return this._commandName; }
            
set this._commandName = value; }
        }


        
private string _confirmMessage;
        
/// <summary>
        
/// 确认框弹出的信息
        
/// </summary>

        public string ConfirmMessage
        
{
            
get return this._confirmMessage; }
            
set this._confirmMessage = value; }
        }

    }

3、新建一个继承自CollectionBase的类ConfirmButtons
     /// <summary>
    
/// ProjectGroups 的摘要说明。
    
/// 注意要继承自CollectionBase
    
/// </summary>

    [
    ToolboxItem(
false ),
    ParseChildren(
true )
    ]
    
public   class  ConfirmButtons : CollectionBase
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>

        public ConfirmButtons()
            : 
base()
        
{
        }


        
/// <summary>
        
/// 实现IList接口
        
/// 获取或设置指定索引处的元素。
        
/// </summary>
        
/// <param name="index">要获得或设置的元素从零开始的索引</param>
        
/// <returns></returns>

        public ConfirmButton this[int index]
        
{
            
get
            
{
                
return (ConfirmButton)base.List[index];
            }

            
set
            
{
                
base.List[index] = (ConfirmButton)value;
            }

        }


        
/// <summary>
        
/// 实现IList接口
        
/// 将某项添加到 System.Collections.IList 中。
        
/// </summary>
        
/// <param name="item">要添加到 System.Collections.IList 的 System.Object。</param>

        public void Add(ConfirmButton item)
        
{
            
base.List.Add(item);
        }


        
/// <summary>
        
/// 实现IList接口
        
/// 从 System.Collections.IList 中移除特定对象的第一个匹配项。
        
/// </summary>
        
/// <param name="index">要从 System.Collections.IList 移除的 System.Object</param>

        public void Remove(int index)
        
{
            
if (index > -1 && index < base.Count)
            
{
                
base.List.RemoveAt(index);
            }

        }

    }

4、新建一个继承自ExpandableObjectConverter的类ConfirmButtonConverter
     /// <summary>
    
/// 类型转换器
    
/// </summary>

     public   class  ConfirmButtonConverter : ExpandableObjectConverter
    
{
        
/// <summary>
        
/// 返回值能否将ConfirmButton类型转换为String类型
        
/// </summary>
        
/// <param name="context"></param>
        
/// <param name="destinationType"></param>
        
/// <returns></returns>

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        
{
            
if (destinationType == typeof(string))
            
{
                
return true;
            }

            
return base.CanConvertTo(context, destinationType);
        }


        
/// <summary>
        
/// 将ConfirmButton类型转换为String类型
        
/// </summary>
        
/// <param name="context"></param>
        
/// <param name="culture"></param>
        
/// <param name="value"></param>
        
/// <param name="destinationType"></param>
        
/// <returns></returns>

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture,
            
object value, Type destinationType)
        
{
            
if (value != null)
            
{
                
if (!(value is YYControls.SmartGridView.ConfirmButton))
                
{
                    
throw new ArgumentException(
                        
"无效的ConfirmButton""value");
                }

            }


            
if (destinationType.Equals(typeof(string)))
            
{
                
if (value == null)
                
{
                    
return String.Empty;
                }

                
return "ConfirmButton";
            }

            
return base.ConvertTo(context, culture, value, destinationType);
        }

    }

5、在继承自GridView的类中加一个复杂对象属性,该复杂对象就是第3步创建的那个ConfirmButtons
         private  ConfirmButtons _confirmButtons;
        
/// <summary>
        
/// 确认按钮集合
        
/// </summary>

        [
        PersistenceMode(PersistenceMode.InnerProperty),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        Description(
" 确认按钮集合,确认按钮的CommandName和提示信息 " ),
        Category(
" 扩展 " )
        ]
        
public   virtual  ConfirmButtons ConfirmButtons
        
{
            
get
            
{
                
if (_confirmButtons == null)
                
{
                    _confirmButtons 
= new ConfirmButtons();
                }

                
return _confirmButtons;
            }

        }


6、重写OnRowDataBound实现单击命令按钮弹出确认框的功能。主要是给按钮增加一个客户端的onclick事件。
         /// <summary>
        
/// OnRowDataBound
        
/// </summary>
        
/// <param name="e"></param>

         protected   override   void  OnRowDataBound(GridViewRowEventArgs e)
        
{
            
if (e.Row.RowType == DataControlRowType.DataRow)
            
{
                
if (this._confirmButtons != null)
                
{
                    
// GridViewRow的每个TableCell
                    foreach (TableCell tc in e.Row.Cells)
                    
{
                        
// TableCell里的每个Control
                        foreach (Control c in tc.Controls)
                        
{
                            
// 如果控件继承自接口IButtonControl
                            if (c.GetType().GetInterface("IButtonControl"!= null && c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))
                            
{
                                
// 从用户定义的ConfirmButtons集合中分解出ConfirmButton
                                foreach (ConfirmButton cb in _confirmButtons)
                                
{
                                    
// 如果发现的按钮的CommandName在ConfirmButtons有定义的话
                                    if (((IButtonControl)c).CommandName == cb.CommandName)
                                    
{
                                        
// 增加确认框属性
                                        ((IAttributeAccessor)c).SetAttribute("onclick""return confirm('" + cb.ConfirmMessage + "')");
                                        
break;
                                    }

                                }

                            }

                        }

                    }

                }

            }


            
base.OnRowDataBound(e);
        }



控件使用
添加这个控件到工具箱里,然后拖拽到webform上,设置其ConfirmButtons属性即可。CommandName是命令按钮的CommandName属性;ConfirmMessage是弹出的确认框所显示的文字。
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
{
    
public OjbData()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    [DataObjectMethod(DataObjectMethodType.Select, 
true)]
    
public DataTable Select()
    
{
        DataTable dt 
= new DataTable();
        dt.Columns.Add(
"no"typeof(string));
        dt.Columns.Add(
"name"typeof(string));

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

            dt.Rows.Add(dr);
        }


        
return dt;
    }

}


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

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  runat ="server" >
    
< title > 无标题页 </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
        
< div >
            
&nbsp;
            
< yyc:SmartGridView  ID ="SmartGridView1"  runat ="server"  AutoGenerateColumns ="false"
                DataSourceID
="ObjectDataSource1" >
                
< Columns >
                    
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                    
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
                    
< asp:ButtonField  CommandName ="ConfirmTest"  Text ="确认按钮测试"   />
                
</ Columns >
                
< ConfirmButtons >
                    
< yyc:ConfirmButton  ConfirmMessage ="确认删除吗?"  CommandName ="ConfirmTest" ></ yyc:ConfirmButton >
                
</ ConfirmButtons >
            
</ yyc:SmartGridView >
            
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  SelectMethod ="Select"
                TypeName
="OjbData" ></ asp:ObjectDataSource >
        
</ div >
    
</ form >
</ body >
</ html >

你可能感兴趣的:(GridView)