随笔-312  评论-11876  文章-2  trackbacks-220

看过《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 阅读(4453) 评论(23)  编辑 收藏 所属分类: ASP.NET 综合

评论:
#1楼  2007-05-20 23:40 | Sammy      
探讨一下,如果我想把Edit和Delete两列放到最后面,并且不是显示文字,而是显示两个图标,不知道有没有办法实现?
  回复  引用  查看    
#2楼  2007-05-20 23:43 | 文泽 [未注册用户]
hmmm... 值得研究哦...
  回复  引用    
#3楼  2007-05-21 00:06 | Silverlight中文社区 [未注册用户]
学习...
  回复  引用    
#4楼  2007-05-21 10:14 | goalbell [未注册用户]
现在微软的东西更新太快了,学无止境啊!
  回复  引用    
#5楼  2007-05-21 16:18 | kangnoz [未注册用户]
这样子是不是只能同时搞一个数据库?
  回复  引用    
#6楼  2007-05-21 22:14 | wma [未注册用户]
... 值得研究哦... 学习...
  回复  引用    
#7楼 [楼主] 2007-05-22 19:49 | Dflying Chen      
@Sammy
通过覆写GetColumns()方法应该可以吧?
  回复  引用  查看    
#8楼 [楼主] 2007-05-22 19:49 | Dflying Chen      
@文泽
:)
  回复  引用  查看    
#9楼 [楼主] 2007-05-22 19:49 | Dflying Chen      
@goalbell
慢慢来吧
  回复  引用  查看    
#10楼 [楼主] 2007-05-22 19:50 | Dflying Chen      
@kangnoz
是的
  回复  引用  查看    
#11楼  2007-05-24 10:04 | Cat Chen      
请问遇到这样的错误怎么解决:
The control must be used in an DynamicDataPage
  回复  引用  查看    
#12楼 [楼主] 2007-05-24 19:10 | Dflying Chen      
@Cat Chen
说是必须要在DynamicDataPage 页面中使用,你是怎么用的呢?
  回复  引用  查看    
#13楼  2007-05-25 18:23 | Cat Chen      
@Dflying Chen
怎样才算一个DDPage?我就是创建了一个和数据表名同名的Page,然后放一个DDControl上去咯。
  回复  引用  查看    
#14楼 [楼主] 2007-05-25 22:10 | Dflying Chen      
@Cat Chen
数据库配置好了么?
http://www.cnblogs.com/dflying/archive/2007/05/20/753553.html
这篇文章中介绍了一些内容,是不是什么地方没搞好呢?
  回复  引用  查看    
#15楼  2007-05-28 11:03 | wqx [未注册用户]
我在配置好可以使用AJAX控件的web.config文件里加上<sectionGroup name="ajaxNet">
<section name="ajaxSettings" type="AjaxPro.AjaxSettingsSectionHandler,AjaxPro.2" requirePermission="false" restartOnExternalChanges="true"/>
</sectionGroup>
<ajaxNet>
<ajaxSettings>
<urlNamespaceMappingsuseAssemblyQualifiedName="false">
</urlNamespaceMappings>
<jsonConverters>
</jsonConverters>
<debug enabled="false"/>
<token enabled="false" sitePassword="password"/>
</ajaxSettings>
</ajaxNet>后来就用不了了,不知道是不是有冲突,加上以后两个所有网页都用不上了,哪个高手指点下。
  回复  引用    
#16楼  2007-05-28 11:23 | newman [未注册用户]
试用了一下,还算不错啊!
针对多表操作怎么作啊,期待陈老师下一篇文章。
  回复  引用    
#17楼  2007-05-28 12:56 | Cat Chen      
@Dflying Chen
漏了web.config中的配置吧,不过web.config中有且仅有一个connectionString啊,而且App_Data中也仅有一个SQL Express的数据库啊。
  回复  引用  查看    
#18楼  2007-05-28 19:21 | Cat Chen      
@Dflying Chen
我发现问题所在了,我新建了一个普通的Page,而不是DDPage。
  回复  引用  查看    
#19楼 [楼主] 2007-05-29 09:01 | Dflying Chen      
@newman
似乎针对多表没有现成的支持……
  回复  引用  查看    
#20楼 [楼主] 2007-05-29 09:02 | Dflying Chen      
@Cat Chen
新建页面的时候难道有选择么?DDPage是什么东西啊?
  回复  引用  查看    
#21楼  2007-05-29 09:46 | Andynamo [未注册用户]
public override void InitDataSource(IDataSource dataSource)
{
dataSource.FilterExpression = ...;
}
怎么改数据源对应的表名呀,好像是目录名或文件名默认为表名。。。
  回复  引用    
#22楼 [楼主] 2007-05-29 12:59 | Dflying Chen      
@Andynamo
是的,都是默认的
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: