DataControlField與Parameter擴展
系統
1696 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元