2008年7月14日,星期一

SPDataSource-每个开发人员's friend (part 2)

SPDataSource-复习

所以 第一部分的最后一次 在这个分为2部分的系列文章中,我们看到了SPDataSource如何是从列表中获取数据的绝佳选择,因为它不仅为您完成了获取项目的实际工作,而且还不需要任何C#/ VB.Net代码。我们可以从列表中检索所有项目,或者,如果我们希望对项目进行过滤/排序,可以选择提供CAML查询以及列表详细信息。因此,正如我在第1部分中所展示的,我们可以轻松地显示一个包含以下标记的下拉列表,其中包含列表中的项目:


<SPWebControls:SPDataSource runat="server" ID="dsPersonTitles" DataSourceMode="List" 
SelectCommand="<Query><OrderBy><FieldRef Name='SortOrder' Ascending='true' /></OrderBy></Query>"
<SelectParameters>
<asp:Parameter Name="WebUrl" DefaultValue="/configuration/" />
<asp:Parameter Name="ListName" DefaultValue="PersonTitles" />
</SelectParameters>
</SPWebControls:SPDataSource>

<asp:DropDownList runat="server" ID="ddlPersonTitles" CssClass="title" DataSourceID="dsPersonTitles" DataTextField="Title" DataValueField="ID">
</asp:DropDownList>




我们还看到了SPDataSource不仅提供了从列表中检索项目的方法,还提供了以下其他“模式”(有关这些方面的更多详细信息,请参见第1部分):

  • CrossList-类似于使用SPSiteDataQuery在网站集中的所有列表中进行查询
  • ListItem-显示单个列表项中的字段值

  • 网站-列出网站集中的所有网站

  • ListOfLists-列出网络中的所有列表

我这次要重点关注的是如何在SPDataSource中使用参数,因为在实际使用控件时,您经常会想这样做。

SPDataSource的参数

SPDataSource的工作方式与其他.Net数据源控件一样,因此传递参数的关键是使用.Net 2.0参数类之一(以声明方式(在标记中)或在代码中)。上面的示例显示了使用基本 参数 类,方法是将DefaultValue属性设置为已知字符串,但也可以使用以下参数类型(尽管请注意,我还没有尝试全部, SPD团队博客文章 我提到有些含糊地说"most"其中可以使用!):

有效地使用其中之一可以节省编写代码以从相应位置读取值并将其自己传递给SPDataSource的麻烦。我认为ControlParameter和QueryStringParameter可能是最具价值的,尽管根据您的要求,它们可能会很有趣。例如,要获取用户从包含列表列表的下拉菜单中选择的用户的值,并将其传递给SPDataSource控件,我需要:


<SelectParameters>
<asp:Parameter Name="WebUrl" DefaultValue="/configuration/" />
    <asp:ControlParameter Name="ListName" ControlID="ddlLists"
PropertyName="SelectedValue"/>
</SelectParameters>

我似乎在ControlParameter上获得了一些控件执行生命周期的乐趣,但最终还是奏效了。从“ userID”中提取值 请求参数 我需要的参数:


<SelectParameters>
<asp:QueryStringParameter Name="userId" QueryStringField="userId" />
</SelectParameters>

不仅如此,我还可以将参数值放入字符串(例如在“列表”模式的较早示例中使用的CAML查询)中:


<SPWebControls:SPDataSource runat="server" ID="dsPersonTitles" DataSourceMode="List"
SelectCommand="<Query><OrderBy><FieldRef Name='{SortField}' Ascending='{SortAsc}' /></OrderBy></Query>">
<SelectParameters>
<asp:Parameter Name="WebUrl" DefaultValue="/configuration/" />
<asp:Parameter Name="ListName" DefaultValue="PersonTitles" />
<asp:QueryStringParameter Name="SortField" QueryStringField="SortField" DefaultValue="SortOrder" />
<asp:QueryStringParameter Name="SortAsc" QueryStringField="SortAsc" DefaultValue="true" />
</SelectParameters>
</SPWebControls:SPDataSource>

请注意,这里我是根据querystring参数动态指定排序字段和方向。酷的东西。

构建您自己的参数控件的想法更酷-使我印象深刻的是从用户的SharePoint配置文件中检索值的一种(因为上面列出的ProfileParameter是指ASP.Net配置文件)。 Scott Mitchell在以下位置对此有很好的指导 在ASP.NET 2.0中访问和更新数据:创建自定义参数控件.

概要

因此,我们在那里已经涵盖了很多基础,因此以下是为什么SPDataSource是您的朋友的概述:

  • 可以绑定到任何可以进行数据绑定的控件-DropdownList,ListBox,CheckBoxList是一些显而易见的候选对象,但也可以考虑Repeater,DataGrid和SharePoint DataView / SPGridView控件

  • 可以轻松地从其他控件,查询字符串,会话,表单值等获取参数(或编写一些代码以从其他位置获取)

  • 可以使用多种模式进行不同的查询,例如列表中的项目,列表项的属性,站点中的网站等。

如果您想了解更多,我建议阅读 SPDataSource和具有数据视图的汇总 -这强调了将SPDataSource与SharePoint DataViews一起使用,但也提供了一些我没有介绍的很好的示例,例如使用“ CrossList”模式。

20条评论:

匿名 said...

克里斯,你好

感谢您所有有用的博客。

我是SharePoint Designer的新手。我需要在设计器中创建一个非常简单的工作流,应在添加/更新列表中的项目时启动该工作流,并进行如下操作:

1.检查列(选择是/否)值。

2.如果“是”,则在发布此项目之前,应先向批准者组批准。

3.批准人应提交带有批准,拒绝按钮的表格。

4.如果批准者单击“批准”按钮,则项目将以“是”作为选择值列发布。

5.如果被拒绝,则该项目将以“否”作为选择列的值发布,并通过电子邮件发送该项目的作者。

对不起,我的英语不好!

麦克风

克里斯·奥'Brien说过...

嗨,迈克,

害怕我在SPD工作流程上做得还不够,所以真的无济于事。建议检查SPD团队博客上的一些帖子。

祝你好运

克里斯。

匿名 said...

嗨,迈克,
我发现SPDataSource上的这些文章非常有趣!
亲切的问候,
卡琳

匿名 said...

克里斯你好

您如何解决控制执行生命周期问题。我正在尝试使用ControlParemeter渲染另一个下拉菜单。尽管一切正常,但更改第一个下拉菜单时,第二个下拉列表不会更改。谢谢

理查德

克里斯·奥'Brien说过...

嗨,理查德,

恐怕我需要看看您在做什么才能解决问题。正如我说的,实际上我最终使它工作正常-只是我认为我最初尝试在周期中做得太晚了。

干杯,

克里斯。

匿名 said...

嗨,我遇到了Richard的同样问题,它看起来好像ControlParameter在浏览器第一次加载页面时获取值,但在随后的回发中却没有,该代码以前与您的相同。
也许可以是任何共享点缓存?

克里斯·奥'Brien说过...

@匿名,

再说一次,我认为这更可能是页面执行生命周期的事情,而不是缓存-除非您显然在进行某种形式的缓存。

不幸的是,我不记得是否需要更改任何内容以在回发时重新绑定,但是上面的标记绝对是我的工作方式。抱歉,我帮不上忙。

干杯,

克里斯。

未知说过...

该代码实际上在哪里?我了解代码,但不知道它将进入哪个文件。起初,我认为它将放在自定义newform.aspx页面中

克里斯·奥'Brien说过...

@邪恶的天才,

代码类型随您所需要-对我而言,它位于MOSS页面布局(WCM)中,该页面托管了我的下拉控件。

在您的情况下,听起来您想在SharePoint列表页面上使用它。在那种情况下,我认为应该在SharePoint Designer中编辑适当的表单(例如newform.aspx)。

HTH,

克里斯。

罗伯特·马丁内斯 said...

要解决控件执行生命周期问题,请将您要过滤的下拉菜单的EnableViewState行为更改为False。将其设置为true时,您会告诉下拉列表即使往返也要保留其值。

克里斯·奥'Brien说过...

罗伯特你好,

谢谢,但是我认为那不是我当时遇到的执行生命周期问题。

仍然欣赏指针:-)

克里斯。

匿名 said...

克里斯,你好
我在交叉列表模式下使用SPDatasource从“任务”列表中查询数据,并将其绑定到SPGridview。但我确实得到一个错误的说法"名称为的字段或属性'Title'在所选数据源上找不到。
如果我在列表模式下使用SPDatasource,则一切正常。
非常感谢在这方面的任何帮助。
谢谢,
格拉纳达

克里斯·奥'Brien说过...

@格拉纳达,

对不起,我没有'在交叉列表模式下使用SPDataSource可以做很多事情。猜测可能是因为查询中涉及的列表之一没有't包含一列'Title'.

祝你好运

克里斯。

艾伦 said...

克里斯,你好

您将如何使用SPDataSource返回查找字段的ID部分。

I've tried using

<ViewFields>
<FieldRef LookupId='TRUE' name='MyField1 />
</ViewFields>

在SPDatasource的select命令中,但是始终返回查找ID的文本内容。

克里斯·奥'Brien说过...

@艾伦

不知道我'm afraid, I don't think I'-已将SPDataSource与查找字段一起使用。

祝你好运..

克里斯。

基思·奥斯瓦尔特说过...

嘿,艾伦,

I'我不确定您是否只能在SPDataSource的选择部分中返回查找字段的ID。根据定义,无论类型如何,您都在请求该字段。

万一你不'知道,您可以使用SPQuery查询您的SharePoint列表,使用SPList.GetItems(SPQuery)获取SPListItemCollection,然后将SPFieldLookupValue分配给您的查找字段。从那里,您将使用SPFieldLookupValue.LookupID来获取您的查找字段的ID。

I'我仍在学习SharePoint,因此可能会有更好的方法,但这对我有用。

HTH,

基思

未知说过...

感谢您发布有关将SPDatasources绑定到控件的见解。对于仅提供Designer的用户而言,这是一个巨大的胜利。

干杯,
马特

未知说过...

优秀的文章。您如何根据文本框的输入而不是下拉列表过滤数据?我正在寻找一种解决方案,该解决方案使用按类型输入的过滤器来过滤针对特定列的SPDataSource和asp:GridView。

谢谢。

匿名 said...

感谢您是为使用参数对SPDataSource进行过滤提供任何指导的极少数人之一...关于它的其他博客都没有'findable'...再次感谢您的出色工作!

加里马说过...

克里斯,你好
感谢您的精彩博客。我从中学到了很多。
一个问题:您是否曾经在SPDataSource中使用托管元数据列?
就我而言,我将SPGridView与SPDataSource绑定在一起,但是在过滤时却给了我"TermName|TermGUID". Could you help?