首页 > 编程 > .NET > 正文

ASP.NET2.0中使用数据源控件之参数

2024-07-10 13:03:47
字体:
来源:转载
供稿:网友
摘要:本文是介绍数据源控件的系列文章中的第二篇。在本文中,nikhil 着重介绍如何添加支持以向针对控件的查询添加参数。

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表