数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 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();
}
}
}
新闻热点
疑难解答
图片精选