扩展GridView控件(3) – 根据按钮的CommandName设置其客户端属性作者:webabcd/*正式版的实现 开始*/介绍扩展GridView控件:根据按钮的CommandName设置其客户端属性使用方法(设置ClientButtons集合属性):BoundCommandName-需要绑定的CommandNameAttributeKey-属性的名称AttributeValue-属性的值(两个占位符:{0}-CommandArgument;{1}
作者:webabcd
/*
正式版的实现 开始
*/
介绍 扩展GridView控件: 根据按钮的CommandName设置其客户端属性
使用方法(设置ClientButtons集合属性): BoundCommandName – 需要绑定的CommandName AttributeKey – 属性的名称 AttributeValue – 属性的值(两个占位符:{0} – CommandArgument;{1} – Text) Position – 属性的值的位置
关键代码
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Web.UI.WebControls;
using
System.Web.UI;
namespace
YYControls.SmartGridViewFunction
{
/**/ /// <summary> /// 扩展功能:根据按钮的CommandName设置其客户端属性 /// </summary> public class ClientButtonFunction : ExtendFunction {
/**/ /// <summary> /// 构造函数 /// </summary> public ClientButtonFunction() : base () {
} /**/ /// <summary> /// 构造函数 /// </summary> /// <param name=”sgv”> SmartGridView对象 </param> public ClientButtonFunction(SmartGridView sgv) : base (sgv) {
} /**/ /// <summary> /// 扩展功能的实现 /// </summary> protected override void Execute() {
this ._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell); } /**/ /// <summary> /// SmartGridView的RowDataBoundCell事件 /// </summary> /// <param name=”sender”></param> /// <param name=”gvtc”></param> void _sgv_RowDataBoundCell( object sender, GridViewTableCell gvtc) {
TableCell tc = gvtc.TableCell; // TableCell里的每个Control foreach (Control c in tc.Controls) {
// 如果控件继承自接口IButtonControl if (c is IButtonControl) {
// 从用户定义的ClientButtons集合中分解出ClientButton foreach (ClientButton cb in this ._sgv.ClientButtons) {
// 如果在ClientButtons中绑定了该按钮的CommandName if (((IButtonControl)c).CommandName == cb.BoundCommandName) {
// 替换占位符{0}-CommandArgument;{1}-Text string attributeValue = String.Format( cb.AttributeValue, ((IButtonControl)c).CommandArgument, ((IButtonControl)c).Text); // 设置按钮的客户端属性 YYControls.Helper.Common.SetAttribute( (IAttributeAccessor)c, cb.AttributeKey, attributeValue, cb.Position); break ; } } } } } } }
/*
正式版的实现 结束
*/
/*
测试版的实现 开始
*/
介绍 给按钮增加单击弹出确认框的功能是经常要用到的,我们一般是通过在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
>
<
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
>
/*
测试版的实现 结束
*/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。 如需转载请保留出处:https://bianchenghao.cn/35658.html