亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

DataControlField與Parameter擴(kuò)展

系統(tǒng) 1963 0
一.為數(shù)據(jù)綁定控件(GridView)自定義列( DataControlField)

本來asp.net1.1中已經(jīng)存在DataGrid了,其中為我們提供了豐富的數(shù)據(jù)字段類型(即不同綁定列),如下代碼

< 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 >
網(wǎng)上也有介紹擴(kuò)展 DataGridColumn類的方法, asp.net2.0新增的GridView定義了全新的數(shù)據(jù)列,其也可以用于DetailsView,即 DataControlField類

來看下其內(nèi)置列的實(shí)現(xiàn)

DataControlField與Parameter擴(kuò)展

DataControlField類為數(shù)據(jù)列的基類,其派生類相信大家都很熟悉,如下圖

DataControlField與Parameter擴(kuò)展

當(dāng)然我們這里討論的不是怎么使用這些列,而是如何實(shí)現(xiàn)自定義列的過程.實(shí)現(xiàn)方法跟以前的有些相似,還是抽象類 DataControlField為我們實(shí)現(xiàn)了一些常用方法,并定義了一些必須讓我們?nèi)?shí)現(xiàn)的方法,讓字類去重寫.

下面列出常用相關(guān)的方法

這里以 自定義CalendarField 列為例

看DataControlField的 CloneField ()方法,先創(chuàng)建對(duì)象,再復(fù)制屬性
protected internal DataControlFieldCloneField()
{
DataControlFieldnewField
= this .CreateField();
this .CopyProperties(newField);
return newField;
}



1.創(chuàng)建列對(duì)象

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

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


2.復(fù)制屬性

DataControlField提供了 CopyProperties 方法

首先要先定義你需要的屬性,然后將屬性復(fù)制給CloneField方法中創(chuàng)建的對(duì)象,在更改屬性時(shí)要記得調(diào)用OnFieldChanged方法,通知 DataControlField 對(duì)象狀態(tài)發(fā)生變化,觸發(fā)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.初始化單元格狀態(tài)(InitializeCell方法)

即把你自己定義的東西添加到表格中。這里需要注意順序

我們知道GridView的單元格(即 DataControlCellType) 分為三種類型,頁眉,頁腳,數(shù)據(jù)項(xiàng),到了確定是數(shù)據(jù)項(xiàng)以后,又要給 數(shù)據(jù)行 分類型

如編輯,插入,交替,選中等(即 DataControlRowState )

BoundField 在普通狀態(tài)下是文本,在編輯狀態(tài)下是TextBox.這里就是要做這個(gè)工作,在不同狀態(tài)下,加載不同控件。如下代碼

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

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

// 如果為數(shù)據(jù)項(xiàng)
if (cellType == DataControlCellType.DataCell)
InitializeDataCell(cell,rowState);
}


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

DataControlRowStatestate
= rowState & DataControlRowState.Edit;

// 根據(jù)狀態(tài)加載不同控件
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.實(shí)現(xiàn)數(shù)據(jù)交互 ( 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.給列添加設(shè)計(jì)時(shí)支持

BoundField列在有字段綁定的情況下,在設(shè)計(jì)時(shí)顯示如下

DataControlField與Parameter擴(kuò)展

其是通過 GetDesignTimeValue 方法實(shí)現(xiàn)的,如可以這樣定義

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

在頁面效果如下

DataControlField與Parameter擴(kuò)展

好了,大致步驟就如此,你只需要熟悉上面方法,照著步驟做一遍就可以了.
另外還有DataGrid的DataGridColumn,如果你理解上面 DataControlField 的做法的話,DataGridColumn的實(shí)現(xiàn)關(guān)鍵方法則是 InitializeCell ,方法比較相似.但其沒有 ExtractValuesFromCell方法, 因?yàn)镈ataGrid當(dāng)時(shí)還沒有這么的智能化的自動(dòng)編輯功能 .

二.數(shù)據(jù)源控件控件自定義參數(shù)

數(shù)據(jù)源控件我們也比較常用,所以要學(xué)習(xí)下如何自定義參數(shù),如下圖,為內(nèi)置已經(jīng)實(shí)現(xiàn)的幾個(gè)參數(shù)類.

DataControlField與Parameter擴(kuò)展

我們還是關(guān)注下 Parameter類,其主要提供了一個(gè)空的 Evaluate 方法給,派生類需要實(shí)現(xiàn)此方法返回經(jīng)過更新的值.其實(shí)現(xiàn)比較簡(jiǎn)單,來看下其內(nèi)部 QueryStringParameter 的實(shí)現(xiàn)過程.應(yīng)該說沒什么難度.抓住重點(diǎn)就好


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<
分享到:
評(píng)論

DataControlField與Parameter擴(kuò)展


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久久久国产精品免费网站 | 国产观看精品一区二区三区 | 免看一级a毛片一片成人不卡 | 一级毛片无毒不卡直接观看 | 97精品一区二区三区在线不卡 | 四虎影院最新 | 日本免费一级 | jizz美女| 欧美激情伦妇在线观看 | 日本高清免费毛片久久看 | 国产1区2区三区不卡 | 国产精品欧美一区二区在线看 | 五月婷婷在线免费观看 | 四虎永久地址4hu2019 | 久艹在线播放 | 97影院支持微信微博观看 | 狠狠五月婷婷 | www.色午夜| 欧美人交性视频在线香蕉 | 亚洲一级毛片免观看 | 性色生活免费看性大片 | 免费一看一级毛片人 | 亚洲国产一区在线二区三区 | 福利色姬网站视频入口 | 深夜精品寂寞在线观看黄网站 | 免费看美女隐私的网站 | 国产精品视频免费观看 | 久草在在线视频免费 | 国产色影院 | 国产午夜精品尤物福利视频 | 四虎影视精品永久免费网站 | 欧美不卡影院 | 色偷偷亚洲天堂 | 国产精品一区二区国产 | 日日摸夜夜添夜夜添一区二区 | 国产精品videossex激情 | 伊人99| 九色福利 | 日本又黄又爽又色的视频免费 | 精品香蕉一区二区三区 | 黄色免费看看 |