DataControlField与Parameter扩展

系统 1513 0
一.为数据绑定控件(GridView)自定义列( DataControlField)

本来asp.net1.1中已经存在DataGrid了,其中为我们提供了丰富的数据字段类型(即不同绑定列),如下代码

< asp:DataGrid ID ="dg1" runat ="server" >
< Columns >
< asp:BoundColumn ></ asp:BoundColumn >
< asp:ButtonColumn ></ asp:ButtonColumn >
< asp:HyperLinkColumn ></ asp:HyperLinkColumn >
< asp:TemplateColumn ></ asp:TemplateColumn >
</ Columns >
</ asp:DataGrid >
网上也有介绍扩展 DataGridColumn类的方法, asp.net2.0新增的GridView定义了全新的数据列,其也可以用于DetailsView,即 DataControlField类

来看下其内置列的实现

DataControlField与Parameter扩展

DataControlField类为数据列的基类,其派生类相信大家都很熟悉,如下图

DataControlField与Parameter扩展

当然我们这里讨论的不是怎么使用这些列,而是如何实现自定义列的过程.实现方法跟以前的有些相似,还是抽象类 DataControlField为我们实现了一些常用方法,并定义了一些必须让我们去实现的方法,让字类去重写.

下面列出常用相关的方法

这里以 自定义CalendarField 列为例

看DataControlField的 CloneField ()方法,先创建对象,再复制属性
protected internal DataControlFieldCloneField()
{
DataControlFieldnewField
= this .CreateField();
this .CopyProperties(newField);
return newField;
}



1.创建列对象

DataControlField提供了 CopyProperties 方法,此工作一定要做

protected override DataControlFieldCreateField()
{
return new CalendarField();
}


2.复制属性

DataControlField提供了 CopyProperties 方法

首先要先定义你需要的属性,然后将属性复制给CloneField方法中创建的对象,在更改属性时要记得调用OnFieldChanged方法,通知 DataControlField 对象状态发生变化,触发FieldChanged事件


<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> Customproperties #region Customproperties
// *******************************************************************
// PROPERTY:DataField
// Indicatesthefieldprovidingthedateinviewmode
public virtual string DataField
{
get
{
object o = this .ViewState[ " DataField " ];
if (o != null )
return ( string )o;
return String.Empty;
}

set
{
ViewState[
" DataField " ] = value;
OnFieldChanged();
}

}



// *******************************************************************
// PROPERTY:ReadOnly
// Indicatesthefieldfromwhichthetextofthedrop-downitemsistaken
public virtual bool ReadOnly
{
get
{
object o = base .ViewState[ " ReadOnly " ];
if (o != null )
return ( bool )o;
return false ;
}

set
{
base .ViewState[ " ReadOnly " ] = value;
OnFieldChanged();
}

}



// *******************************************************************
// PROPERTY:DataFormatString
// Indicatestheformatstringforthedate
public virtual string DataFormatString
{
get
{
object o = this .ViewState[ " DataFormatString " ];
if (o != null )
return ( string )o;
return String.Empty;
}

set
{
ViewState[
" DataFormatString " ] = value;
OnFieldChanged();
}

}


#endregion


// *******************************************************************
// METHOD:CopyProperties
//
protected override void CopyProperties(DataControlFieldnewField)
{
((CalendarField)newField).DataField
= this .DataField;
((CalendarField)newField).DataFormatString
= this .DataFormatString;
((CalendarField)newField).ReadOnly
= this .ReadOnly;

base .CopyProperties(newField);
}

3.初始化单元格状态(InitializeCell方法)

即把你自己定义的东西添加到表格中。这里需要注意顺序

我们知道GridView的单元格(即 DataControlCellType) 分为三种类型,页眉,页脚,数据项,到了确定是数据项以后,又要给 数据行 分类型

如编辑,插入,交替,选中等(即 DataControlRowState )

BoundField 在普通状态下是文本,在编辑状态下是TextBox.这里就是要做这个工作,在不同状态下,加载不同控件。如下代码

public override void InitializeCell(DataControlFieldCellcell,DataControlCellTypecellType,DataControlRowStaterowState, int rowIndex)
{

base .InitializeCell(cell,cellType,rowState,rowIndex);

// 如果为数据项
if (cellType == DataControlCellType.DataCell)
InitializeDataCell(cell,rowState);
}


protected virtual void InitializeDataCell(DataControlFieldCellcell,DataControlRowStaterowState)
{
Controlctrl
= null ;

DataControlRowStatestate
= rowState & DataControlRowState.Edit;

// 根据状态加载不同控件
if (( ! ReadOnly && (state != DataControlRowState.Normal)) || rowState == DataControlRowState.Insert)
{
Calendarcal
= new Calendar();
cal.ToolTip
= this .HeaderText;
cell.Controls.Add(cal);

if ((DataField.Length != 0 ) &&
(DataField.Length
!= 0 ))
ctrl
= cal;

_inInsertMode
= rowState == DataControlRowState.Insert;
}

else if (DataField.Length != 0 )
{
ctrl
= cell;
}


// 给控件赋绑定的值
if ((ctrl != null ) && Visible)
{
ctrl.DataBinding
+= new EventHandler( this .OnBindingField);
}

}

4.实现数据交互 ( ExtractValuesFromCell方法)

第三步骤是显示信息,这里则需要提取字段的值,然后添加到 dictionary集合中.具体其他操作暂且不管。

public override void ExtractValuesFromCell(IOrderedDictionarydictionary,DataControlFieldCellcell,DataControlRowStaterowState, bool includeReadOnly)
{
object selectedValue = null ;
if (cell.Controls.Count > 0 )
{
Calendarcal
= cell.Controls[ 0 ] as Calendar;

if (cal == null )
{
throw new InvalidOperationException( " CalendarFieldcouldnotextractcontrol. " );
}

else
selectedValue
= cal.SelectedDate;
}


// Addthevaluetothedictionary
if (dictionary.Contains(DataField))
dictionary[DataField]
= selectedValue;
else
dictionary.Add(DataField,selectedValue);
}

5.给列添加设计时支持

BoundField列在有字段绑定的情况下,在设计时显示如下

DataControlField与Parameter扩展

其是通过 GetDesignTimeValue 方法实现的,如可以这样定义

protected virtual string GetDesignTimeValue()
{
return " <select><option>DataboundDate</option></select> " ;
}

在页面效果如下

DataControlField与Parameter扩展

好了,大致步骤就如此,你只需要熟悉上面方法,照着步骤做一遍就可以了.
另外还有DataGrid的DataGridColumn,如果你理解上面 DataControlField 的做法的话,DataGridColumn的实现关键方法则是 InitializeCell ,方法比较相似.但其没有 ExtractValuesFromCell方法, 因为DataGrid当时还没有这么的智能化的自动编辑功能 .

二.数据源控件控件自定义参数

数据源控件我们也比较常用,所以要学习下如何自定义参数,如下图,为内置已经实现的几个参数类.

DataControlField与Parameter扩展

我们还是关注下 Parameter类,其主要提供了一个空的 Evaluate 方法给,派生类需要实现此方法返回经过更新的值.其实现比较简单,来看下其内部 QueryStringParameter 的实现过程.应该说没什么难度.抓住重点就好


public class QueryStringParameter:Parameter
{
public QueryStringParameter()
{
}


protected QueryStringParameter(QueryStringParameteroriginal): base (original)
{
this .QueryStringField = original.QueryStringField;
}


public QueryStringParameter( string name, string queryStringField): base (name)
{
this .QueryStringField = queryStringField;
}


public QueryStringParameter( string name,TypeCodetype, string queryStringField): base (name,type)
{
this .QueryStringField = queryStringField;
}


protected override ParameterClone()
{
return new QueryStringParameter( this );
}


protected override object<
分享到:
评论

DataControlField与Parameter扩展


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论