數據源控件需要使用參數值來指定需要選擇哪些數據,或者指定如何修改數據以及修改什么數據。通常情況下,頁面包含一些 ui,以定義那些必須在選擇操作中使用的參數,而數據綁定控件提供了參數值來進行插入、更新和刪除操作。但是,在任意一種情況下,都可能同時出現兩種現象。在第 1 部分中,數據源控件揭示了 zipcode 屬性,該屬性可進行聲明性設置,或者以編碼來設置以響應用戶操作。參數被設計為以聲明性(且可擴展)的方式來完成此方案。
引言
parameter 基類代表一個通用參數。microsoft visual studio 2005 提供了諸如 querystringparameter 之類的參數,以便將數據從查詢字符串參數請求到數據源中。另一個非常有用的參數是 controlparameter,該參數允許從任一控件屬性中請求數據。如果內置參數類型不能滿足您的要求,則您可以定義自己的參數類型。這樣您就可以使頁面與粘接代碼不相關,而是將該代碼整齊地封裝在參數實現中。
除了從不同的源中請求值,這些參數還可以跟蹤值的更改情況,并通知這些更改的所屬數據源,進而引發數據源更改通知,最終在數據綁定控件中觸發數據綁定操作。簡而言之,這就是使用 controlparameters 時,主要的聲明性詳細方案所依據的原理。
示例
在此將向 weatherdatasource 添加參數功能,然后進一步闡述。
public class weatherdatasource : datasourcecontrol {
public static readonly string zipcodeparametername = "zipcode";
...
private parametercollection _parameters;
private parametercollection parameters {
get {
if (_parameters == null) {
_parameters = new parametercollection();
_parameters.parameterschanged
+= new eventhandler(this.onparameterschanged);
if (istrackingviewstate) {
((istatemanager)_parameters).trackviewstate();
}
}
return _parameters;
}
}
...
public string getselectedzipcode() {
if (_parameters != null) {
parameter zipcodeparameter =
_parameters[zipcodeparametername];
if (zipcodeparameter != null) {
iordereddictionary parametervalues =
_parameters.getvalues(context, this);
return (string)parametervalues[zipcodeparameter.name];
}
}
return zipcode;
}
protected override void loadviewstate(object state) {
object basestate = null;
if (state != null) {
pair p = (pair)state;
basestate = p.first;
if (p.second != null) {
((istatemanager)parameters).loadviewstate(p.second);
}
}
base.loadviewstate(basestate);
}
protected override void oninit(eventargs e) {
page.loadcomplete += new eventhandler(this.onpageloadcomplete);
}
private void onpageloadcomplete(object sender, eventargs e) {
if (_parameters != null) {
_parameters.updatevalues(context, this);
}
}
private void onparameterschanged(object sender, eventargs e) {
currentconditionsview.raisechangedevent();
}
protected override object saveviewstate() {
object basestate = base.saveviewstate();
object parameterstate = null;
if (_parameters != null) {
parameterstate = ((istatemanager)_parameters).saveviewstate();
}
if ((basestate != null) || (parameterstate != null)) {
return new pair(basestate, parameterstate);
}
return null;
}
protected override void trackviewstate() {
base.trackviewstate();
if (_parameters != null) {
((istatemanager)_parameters).trackviewstate();
}
}
}
新聞熱點
疑難解答
圖片精選