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

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與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條評論
主站蜘蛛池模板: 久久天天躁夜夜躁狠狠躁2015 | 成人欧美日韩高清不卡 | 精品日产1区2区 | 久久爱综合久久爱com | 欧美成人国产一区二区 | 久久中文字幕网 | 欧洲亚洲综合一区二区三区 | 99尹人香蕉国产免费天天拍 | 印度老妇bbwfreexxx | 49xxx中国妇女内谢视频 | 99热久久这里只有精品7 | 婷婷亚洲综合 | 伊人热人久久中文字幕 | 欧美日日操 | 日日噜噜噜夜夜爽爽狠狠 | 五月婷视频 | 久久这里只有免费精品6www | 亚洲第3页| 国产高清a毛片在线看 | 国产亚洲精 | 九色91精品国产网站 | 热re99久久精品国产99热 | 一级一级女人18毛片 | 香蕉久久ac一区二区三区 | 中国欧美一级毛片免费 | 久久久精品久久久久三级 | 国产一级一级一级成人毛片 | 伊人久久精品午夜 | 日韩区在线| 综合网亚洲 | 美女被cao的视频免费看 | 久久大香香蕉国产免费网vrr | 99在线视频免费 | 兔子bt资源在线 | 久久亚洲日本不卡一区二区 | 狠狠综合久久 | 久草在线这里只有精品 | 亚洲欧洲精品视频在线观看 | 青草视频网 | 免费二区 | 高清视频一区二区 |