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》,其中就较为深入地介绍了动态数据控件的使用方法(包括自定义方法),包含如下几个部分:
- 定位数据库
- 映射到数据库中的表或视图
- 其他各种动态数据控件
- 使用扩展器模式自定义显示样式
- 选择想要显示的列
- 创建自定义列
- 自定义行的显示样式
- 自定义数据源
定位数据库
动态数据控件在选择数据库时,会按照如下顺序进行:
- 若web.config中包含了<dynamicDataControls>定义,且<dynamicDataControls>中声明了数据库连接字符串,那么动态数据控件将使用该数据库:
- 若web.config中没有包含<dynamicDataControls>节,或是<dynamicDataControls>中没有声明数据库连接字符串,且web.config中恰好包含一个且仅有一个数据库连接字符串,那么动态数据控件将使用该数据库。若是web.config中包含多个数据库连接字符串,那么则必须在<dynamicDataControls>中声明数据库连接字符串。
- 若是若web.config中没有数据库连接字符串,但App_Data中包含了一个数据库文件,那么动态数据控件将使用该数据库。若是App_Data中包含多个数据库文件,那么则必须声明数据库连接字符串。
<dynamicDataControls showAllTables="true"
dataLayerType="Microsoft.Web.DynamicDataControls.SqlDataLayer"
connectionString="TASKSConnectionString" >
<nameMap>
</nameMap>
</dynamicDataControls>
映射到数据库中的表或视图
例如数据库中有一个名为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中提供了如下几种动态数据控件:
- DynamicAutoData :把下面所有的控件统统显示到一个页面上。《ASP.NET Futures初探——动态数据控件(Dynamic Data Control):入门》这篇文章就使用该控件做的示例程序。
- DynamicList :将表显示成GridView。
- DynamicDetails 将表显示成DetailsView,即只显示表中的一行数据。
- DynamicFilter :允许用户过滤数据。
- DynamicInsert 允许用户插入数据。
- DynamicNavigator :允许用户在当前所有动态数据控件页面之间进行导航。
- 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 = ...;
}