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类为数据列的基类,其派生类相信大家都很熟悉,如下图
当然我们这里讨论的不是怎么使用这些列,而是如何实现自定义列的过程.实现方法跟以前的有些相似,还是抽象类
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列在有字段绑定的情况下,在设计时显示如下
其是通过
GetDesignTimeValue
方法实现的,如可以这样定义
protected
virtual
string
GetDesignTimeValue()
{
return
"
<select><option>DataboundDate</option></select>
"
;
}
在页面效果如下
好了,大致步骤就如此,你只需要熟悉上面方法,照着步骤做一遍就可以了.
另外还有DataGrid的DataGridColumn,如果你理解上面
DataControlField
的做法的话,DataGridColumn的实现关键方法则是
InitializeCell
,方法比较相似.但其没有
ExtractValuesFromCell方法,
因为DataGrid当时还没有这么的智能化的自动编辑功能
.
二.数据源控件控件自定义参数
数据源控件我们也比较常用,所以要学习下如何自定义参数,如下图,为内置已经实现的几个参数类.
我们还是关注下
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元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元