数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数 据以及修改什么数据。通常情况下,页面包含一些 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)
|