随笔-313  评论-12176  文章-1 

ASP.NET Futures初探——动态数据控件(Dynamic Data Control):深入一些

看过《ASP.NET Futures初探——动态数据控件(Dynamic Data Control):入门》之后,应该深入一些了。本文摘要自ASP.NET Futures官方文档中的《ASP.NET Futures (2007): Introduction to ASP.NET Dynamic Data Controls》,其中就较为深入地介绍了动态数据控件的使用方法(包括自定义方法),包含如下几个部分:

  1. 定位数据库
  2. 映射到数据库中的表或视图
  3. 其他各种动态数据控件
  4. 使用扩展器模式自定义显示样式
  5. 选择想要显示的列
  6. 创建自定义列
  7. 自定义行的显示样式
  8. 自定义数据源

 

定位数据库

动态数据控件在选择数据库时,会按照如下顺序进行:

  1. 若web.config中包含了<dynamicDataControls>定义,且<dynamicDataControls>中声明了数据库连接字符串,那么动态数据控件将使用该数据库:
  2. <dynamicDataControls showAllTables="true"
            dataLayerType="Microsoft.Web.DynamicDataControls.SqlDataLayer"
            connectionString="TASKSConnectionString" > 
        <nameMap>
        </nameMap>
    </dynamicDataControls>
  3. 若web.config中没有包含<dynamicDataControls>节,或是<dynamicDataControls>中没有声明数据库连接字符串,且web.config中恰好包含一个且仅有一个数据库连接字符串,那么动态数据控件将使用该数据库。若是web.config中包含多个数据库连接字符串,那么则必须在<dynamicDataControls>中声明数据库连接字符串。
  4. 若是若web.config中没有数据库连接字符串,但App_Data中包含了一个数据库文件,那么动态数据控件将使用该数据库。若是App_Data中包含多个数据库文件,那么则必须声明数据库连接字符串。

 

映射到数据库中的表或视图

例如数据库中有一个名为Customers的表或视图,那么:

定义于Customers.aspx中的动态数据控件将自动维护该Customers表中的数据。

若是需要使用多个页面维护这个Customers表,那么可以这样命名。注意,其中List.aspx和Details.aspx都有特殊含义。分别用来以列表/详细的方式显示数据:

~/Customers/list.aspx
~/Customers/details.aspx
~/Customers/anotherCustomView.aspx

不过我们也可以覆盖这个默认设置。例如如下<dynamicDataControls>:

<dynamicDataControls listView="MyList" detailsView="MyDetails">
    <nameMap>
        <add table="customers" pathPrefix="~/MyCustFolder" />
    </nameMap>
</dynamicDataControls>

就将Customers表映射到了MyCustFolder文件夹中,而不是默认的Customers文件夹。且其中的List.aspx和Details.aspx也应该改名为MyList.aspx和MyDetails.aspx。

 

其他各种动态数据控件

目前ASP.NET Futures中提供了如下几种动态数据控件:

  1. DynamicAutoData :把下面所有的控件统统显示到一个页面上。《ASP.NET Futures初探——动态数据控件(Dynamic Data Control):入门》这篇文章就使用该控件做的示例程序。
  2. DynamicList :将表显示成GridView。
  3. DynamicDetails 将表显示成DetailsView,即只显示表中的一行数据。
  4. DynamicFilter :允许用户过滤数据。
  5. DynamicInsert 允许用户插入数据。
  6. DynamicNavigator :允许用户在当前所有动态数据控件页面之间进行导航。
  7. DynamicRssLink :以RSS的方式提供数据。

 

使用扩展器模式自定义显示样式

若想控制数据的显示样式,那么只要简单地使用动态数据控件的扩展器模式即可:

<asp:DropDownList runat="server" ID="ddl"
BackColor="Yellow" Font-Italic="true" />
<asp:DynamicFilter runat="server" ColumnName="Category" ControlID="ddl" />

这样即可首先定义数据的显示样式,然后再用动态数据控件向其中“填入”数据。

 

选择想要显示的列

覆写GetColumns()方法即可控制让动态数据控件显示表中的哪些列,例如:

public override IEnumerable GetColumns()
{
    return new object[] { "Description", "Complete" };
}

 

创建自定义列

若想创建自定义列,那么同样只要覆写GetColumns()方法即可:

public override IEnumerable GetColumns()
{
    return new object[] { 
        "Category",
        new DynamicDataColumn(
            delegate { return EvalS("ShipName") + " (" + 
                EvalS("ShipAddress") + ")"; })
    };
}

不过这样添加的新列的标题默认为“Custom Column”。若想指定一个有意义的名称,那么可以使用如下的代码:

public override IEnumerable GetColumns()
{
    return new object[] { 
        "Category",
        new DynamicDataColumn(
            "Description (Complete)",
            delegate { return EvalS("ShipName") + " (" + 
                EvalS("ShipAddress") + ")"; }
        )
    };
}

上述代码也可以用来自定义列的标题。

 

自定义行的显示样式

若想自定义某行的显示样式,那么只要覆写InitRow()方法即可:

public override void InitRow(GridViewRow row)
{
    if (EvalS("ShipName").IndexOf("Buy") > -1)
    {
        row.BackColor = Color.Yellow;;
    }
}

 

自定义数据源

覆写InitDataSource()方法即可完成自定义数据源的功能:

public override void InitDataSource(IDataSource dataSource)
{
    dataSource.FilterExpression = ...;
}
posted on 2007-05-20 23:03 Dflying Chen 阅读(...) 评论(...) 编辑 收藏