Visual Studio 11 beta 版中的SharePoint 开发人员工具 — — 第三部分:在 SharePoint 列表设计器中的提示和技巧

[原文发表地址] SharePoint Developer Tools in Visual Studio 11 Beta – Part III: Tips and Tricks in SharePoint List Designer

[原文发表时间] 2012-04-19 9:07 AM

在这一系列的第一部分中,我们高兴地宣布,SharePoint 列表设计器是 Visual Studio 11 beta 版中引入的新功能之一。通过使用列表设计器,你可以快速和直观地在Visual Studio 中创建一个SharePoint 列表,而无需首先在SharePoint设计器中创建一个列表,然后将其导入到 Visual Studio 中。

在这一系列的第一部分中,为了让你熟悉列表设计器,我们提供了一个 MSDN 帮助主题的链接,它将引导你使用列表设计器来创建一个列表和一个内容类型。如果你已使用过列表设计器,你可能希望了解其功能的更多详细信息。这篇文章提供了有关它的详细信息。

深入 SharePoint 列表设计器页面和它们背后的文件

你可能已经看到当你添加一个新的列表项到 SharePoint 项目中时,可视化设计器打开了三个选项卡:视图列表.

clip_image002

1 SharePoint 列表设计器页面

此外,还在Solution Explorer中创建了一个List节点,包括两个文件 (Schema.xml 和 Elements.xml) 和ListInstance节点 (其节点下面有一个 Elements.xml 文件)。

clip_image003

2 Solution Explorer中的 SharePoint 列表项

如果你以前使用 Visual Studio 2010 创建过列表,这一切对你来说很熟悉。但是有了设计器的支持,你可能想知道"每个xml 文件代表什么?"或者"它们如何与列表设计器交互?"。

· 设计器页面如何与 XML 文件相关联?

在设计器中的视图页面分别允许你在你的列表中自定义列和视图。这些页面中的所有的内容都来自 Schema.xml,它位于Solution Explorer中的List节点下。列表架构可以重复使用来创建不同的列表实例。

列表页面能够让你指定大多数情况下所使用的列表属性。属性的值来源于List Instance 节点(位于List节点下) 下的 Elements.xml 文件。

· 在设计器中何时页面被启用和禁用?

你可以通过点击List节点或List Instance节点来打开 SharePoint 列表设计器。不过,视乎于情况,设计器中将会启用不同的页面:

·如果在 SharePoint 项目中,只有一个列表实例引用了一个特殊的列表架构(在 Schema.xml 文件中被定义了),无论你是通过点击List节点还是List Instance节点来启动设计器的,列表设计器将启用所有的三个页面。

·如果在SharePoint 项目中,多个列表实例引用了同一个列表架构,当你从List节点中启动设计器时,页面将被禁用。如果你将鼠标移至List选项卡上,这会出现一个工具提示,并解释它为什么被禁用。

clip_image005

3 禁用页面时的工具提示

同样地,当从你List Instance节点启动设计器时,仅会启用列表页面。

如果对应的架构列表或列表实例不存在于项目中,相应地,, 视图列表页面就会被禁用。

高效地添加和配置列

你可能享受过在设计器的页面中为列表和内容类型添加列,这多亏了列显示名称的下拉列表中的筛选功能.

事实上,通过设计器中可过滤的下拉列表,有两种方法可以将列添加到列表中: 重新使用网站列,或创建新的列表列。

· 重新使用网站列

若要快速查找到一个网站列来重复使用它,键入网站列的显示名称的任何部分。下拉列表中显示了所有包含该显示名称的列。下面的示例显示了当你键入"name"时,下拉列表中出现的内容:

clip_image007

4 可筛选下拉列表

若要重新使用现有的网站列,在下拉列表中突出显示它,然后按ENTERTab键。该列然后就被添加到列表中了。请注意不能更改网站列的类型。

· 创建新的列表列

列表列是只存在于列表范围中的列。创建列表列是相当容易的。在页面中,键入显示名称到网格中,确保未选中下拉列表中的任何一项,然后按tab .

· 配置列属性

将列添加到列表中之后,你可能想要配置列的属性。属性选项卡显示了部分最常用的列属性。对于其他的列属性,你可以点击列,然后查看属性窗口。

有些属性只对特定的数据类型才有效。你可以通过展开属性窗口中的类型属性来查看这些属性。

clip_image008

5:在属性窗口中的列属性

新建 / 编辑 / 显示Forms时所显示的列

在新建/编辑/显示form时,所显示的列表列取决于添加到列表中的默认内容类型 (在列表架构中第一个定义的或引用的内容类型)。为确保你添加到列表中的列显示在这些窗体中 (在大多数情况下,你可能希望),设计器生成了一个称为ListFieldsContentType的内容类型来引用列表中的所有列,然后将此内容类型设置为默认的内容类型。如果此内容类型不存在的话,无论你是添加还是移除列时,此内容类型都会在架构列表中被定义,并生成它。

clip_image010

图 6: 在内容类型设置对话框中生成内容类型

如果你不需要此内容类型,你可以在你完成添加和移除列后,在内容类型设置对话框中删除它 (它可以通过列表设计器中的页面来启动)。

摘要

在本文中,我们深入了解了 SharePoint 列表设计器,以及使用设计器时幕后所发生的事情。我们希望SharePoint 列表设计器可帮助使你的工作更容易,能够让你更高效地构建列表。如果你对此设计器有任何意见或问题,请让我们知道。我们期待着收到你的来信 !

希望大家喜欢 !

 

Visual Studio 11 测试版中的SharePoint 开发人员工具 — — 第 2 部分: 功能增强来支持 SharePoint Online开发

[原文发表地址] SharePoint Developer Tools in Visual Studio 11 Beta – Part 2: Feature Enhancements to Support SharePoint Online Development

[原文发表时间] 2012-03-22 9:58

关于Visual Studio 11 测试版中的SharePoint 开发人员工具,本系列的第 1 部分概述了所有的新功能。这篇文章更侧重于功能,包括支持构建远程 SharePoint Online解决方案,同时此文也为这一领域的新工具的增强功能提供一个概述。

你可能已经知道, Office 365提供了安全、 全局访问电子邮件和日历、 Office Web 应用程序、 web 会议、 和文件共享。SharePoint Online, Office 365的一个组件,可用于创建远程 SharePoint站点来分享你的文档和信息,这样更容易与客户和同事一起工作。Visual Studio 11 测试版为创建 SharePoint 应用程序提供了改进的支持,它使用了 SharePoint Online,是远程的沙盒环境。为安全起见,在 SharePoint Online 中运行的 SharePoint 解决方案必须是沙盒解决方案。

这里是新的和改进的功能的列表,这些功能旨在让你使用更好的 SharePoint Online开发体验:

· 发布解决方案到远程 SharePoint 服务器中
当你在 Visual Studio 11 测试版中创建一个沙盒SharePoint 解决方案之后,你可以选择将其 SharePoint 解决方案 (.wsp) 文件部署到本地的 SharePoint 服务器中,(正如你可以在早期的Visual Studio版本中所做的一样) 或发布到远程服务器站点。发布是指上传一个沙盒SharePoint 解决方案文件到远程SharePoint 站点中,比如在另一个系统中,或在云中,比如在 SharePoint Online 种。有关详细信息,请参阅部署、 发布和升级SharePoint 解决方案包.

·使用新的 Silverlight Web 部件项目访问外部数据
Visual Studio 11 测试版包括新的 Silverlight Web 部件项目模板,可用于创建基于 Silverlight 的 web 部件。Silverlight Web 部件项目能够让你将精美的、 有用的 Silverlight 控件添加到你的沙盒SharePoint 解决方案中。你可以创建一个新的 Silverlight 项目或利用现有的 Silverlight 项目。当添加到你的 SharePoint 解决方案中时,该模板会添加所有必需的文件,包括 Silverlight web 部件,你可以自定义它们。通过使用
OData,WCF 服务,.NET程序集或Silverlight支持的其他数据源,Silverlight Web 部件项目还提供了简单的方法来连接到外部数据源。当你正在开发一个在沙盒环境中运行的SharePoint Online应用程序时, Silverlight 应用程序能让你连接到你的 SharePoint 解决方案内部的外部数据源。有关使用 Silverlight web 部件和 OData 来访问 SharePoint 数据的示例,请参见演练: 为 SharePoint 创建一个显示 OData的 Silverlight Web 部件.

· SharePoint Online解决方案中使用Visual Web 部件
Visual Studio 11 测试版现在完全支持在沙盒 SharePoint 解决方案中(如在 SharePoint Online中)使用Visual Web部件,这样你的解决方案有了额外的功能,而无需使用加载项。

·在沙盒解决方案中查看筛选过的IntelliSense
大多数 Visual Studio 开发人员发现IntelliSense在查找 API 功能、 语法和用法方面极其有用。但它并没有那么有用,如果它显示了你的项目不能使用的API。当开发远程解决方案来显示只适用于沙盒解决方案的 ApI时,IntelliSense的功能得到了改善。此外,红色波浪线和编译错误会显示,如果你的代码包含任何在沙盒解决方案中不能使用的 API的引用。

· 确定farm-only限制的项目模板
在早期的 Visual Studio版本中,很难辨别哪些项目模板都支持沙盒和farm解决方案,哪些只支持farm解决方案。在 Visual Studio 11 测试版中,仅支持farm解决方案的项目项模板具有明显的标签(仅适用于Farm解决方案),让你更易于选择正确的模板。

对于Visual Studio 11 测试版中的新 SharePoint 功能的完整列表,请参阅 Visual Studio 11 测试版中 SharePoint 开发的新功能。有关 Office 365 和 SharePoint Online的详细信息,请参阅Office 365 和 SharePoint Online。有关SharePoint的详细信息,请参阅SharePoint 2010.

VS 11中的SharePoint开发人员工具——第一部分:VS 11 测试版中SharePoint 开发人员工具的新功能

[原文发表地址] SharePoint Developer Tools in Visual Studio 11 – Part I: What’s New in SharePoint Developer Tools for Visual Studio 11 Beta

[原文发表时间] 2012-03-01 08:27 AM

Visual Studio 11 测试版引入了一套新功能,并增强了在SharePoint 2010中的SharePoint 开发人员工具的现有功能,这能帮助你提高 SharePoint 开发效率。你可能已经尝试了Visual Studio 11 开发人员预览版本中的这些新功能。为了确保你在此更新中获取最多好处,我们SharePoint 开发工具团队计划在接下来的几周里发布一系列文章向你展示所有令人兴奋的新工具的功能。下面是一个关于计划主题的列表,如果你有兴趣知道其他任何特定的主题,请让我们知道:

1. VS 11 测试版中SharePoint 开发工具的新功能(本篇文章)

2.更好地支持 O365 开发

3.在列表设计器中的提示和技巧

4. 在 Visual Studio 11 SharePoint 开发工具中的ALM

作为这一系列的第一篇文章,我们将简要地去浏览测试版中所有的主要功能:

针对 SharePoint 列表和内容类型的SharePoint 列表设计器

现在你可以通过使用新的设计器可视化地创建 SharePoint 列表和内容类型。SharePoint 列表设计器包括针对 SharePoint 列表和内容类型的设计器。

· 网站栏项模板

创建一个网站栏变得比以往更容易了。新的网站栏项模板是一个为你创建网站栏的好起点。它为网站栏生成GUID,并显示了你常用的可能想要设置的属性。

· Silverlight Web 部件

现在将丰富的互联网应用程序(RIA)体验引入到你的 SharePoint 解决方案中变得更加容易了。新的 Silverlight Web 部件项处理了所有的布线,所以你可以专注于设计和编码 Silverlight 部分。它帮助你添加Silverlight 应用程序到你的 SharePoint 解决方案中,并一步将其部署到你的 SharePoint 服务器中。

· 可视化 web 部件支持沙盒解决方案

可视化web 部件将不再仅局限于场解决方案。现在,你可以在场或沙盒解决方案中构建可视的web 部件,而不用任何加载项!

· 新的发布对话框发布 SharePoint 解决方案到远程的SharePoint 服务器中

现在你可以通过Visual Studio将你的 SharePoint 解决方案发布到远程服务器中!新的发布对话框可以让你将SharePoint解决方案发布到任何 SharePoint 服务器上,而不管它是基于前提的还是Office 365的,远程的还是本地的。这还使你能够从你在本地文件系统中指定的位置获取 SharePoint 包。

·针对SharePoint 解决方案性能测试的性能分析工具支持

它能更容易找出什么减慢了你的 SharePoint 解决方案的性能。现在Visual Studio SharePoint 开发工具为性能分析提供充分的支持。

· 沙盒解决方案中更好的智能支持

现在,你可以充分信任沙盒解决方案中的智能,因为智能只显示与你的 SharePoint 项目相关的 API。你不必弄清楚,例如,什么 API 可以在沙盒解决方案与场解决方案中使用。

· 更好地支持JavaScript 调试和智能

现在你可以在你的 SharePoint 解决方案中使用完全的智能支持来编写 JavaScript,另外,在 Visual Studio 中你还能获得更好的JavaScript调试支持。增强的 URL 解析支持使你能够引用 JavaScript 文件,这些文件位于你的 SharePoint 解决方案中的 SharePoint 内容数据库中。

· 简化的 SharePoint 项目模板和项模板

同样地,SharePoint 项目模板和项模板被更好地组织了以便你可以更高效地找到你想要的。

如果你想知道更多这些功能,查看此MSDN 文档,它提供了更多的详细信息以及演练。应当指出的是,SharePoint 2007项目模板(针对工作流的)从 Visual Studio 11 中移除了,如果你想要继续使用 Visual Studio 11 中的那些项目,你需要将这些项目迁移到 SharePoint 2010中。这篇文章是一个学习如何去做到这一点的好起点:迁移2007 工作流到 Visual Studio和 SharePoint 2010中.

现在,请继续尝试Visual Studio 11 测试版中的这些功能。也不要忘记与我们分享你的反馈意见。

希望大家喜欢 !

DataRepeater 虚拟模式的使用

[原文作者]:John Chen

[原文链接]:Using the DataRepeater Virtual Mode

        当在论坛中回答问题的时候,我经常会遇到一个问题,虚拟模式是如何与包含了Visual Basic Power Packs的DataRepeater控件一起工作的?我看到并不是很多人在使用这个强大的功能,所以我再次讨论它是如何工作的,然后通过一个实例来使用它。

        DataRepeater有一个VirtualMode属性,它是做什么用的?

        让我从下面的DataRepeater控件的工作机制图来开始。

clip_image001

                                            图1

         当一个程序启动时,数据从数据库加载到内存中的结构化数据高速缓存(如数据集)。数据高速缓存通过数据绑定机制(如DataRepeater.DataSource = BindingSource)绑定到视图(这里的DataRepeater)。用户通过DataRepeater与数据交互。用户可以滚动视图以显示不同的数据行和修改在不同行的数据。原始数据从数据缓存取出,在视图中显示;修改后的数据又放回到数据缓存中去。只要我们设置数据绑定渠道的属性(像DataRepeater.DataSource = BindingSource),这一切都自动发生。

       使用虚拟模式意味着你不愿使用数据绑定机制,你因为各种原因而想为DataRepeater控件提供你自己的数据管理操作。例如,你可能要提供正在使用的数据,这样你就没有一个可以为DataRepeater用作一般数据源的数据缓存。

       性能是人们选择使用虚拟模式的主要原因之一,尤其是显示大量数据的时候,在DataRepeater控件中,就好像你在控制加载数据并且可以最优化加载速度和内存消耗。

        请注意,性能是一个复杂的问题,它可以被很多因素影响。使用虚拟模式并不能保证你有最佳的结果。例如,如果所有的数据行已经被加载到内存中,像充满TableAdapter.Fill方法的DataSet,你可能不会有虚拟模式的性能增益。

       源于论坛最新的关于DataRepeater虚拟模式用法的问题,接下来,我将给出一个实例来重点介绍如何使用虚拟模式。

约会薄实例

       我的例子是约会薄。它允许你创建电子日程,这个电子日程可以设置在自定义的一周范围内。这是我的新年决心,以更好的管理(开个玩笑)。

       约会薄的界面显示如下:

clip_image002

                                                 图2

        左边是一个每行7天的日历,右边在日历中一行一天地显示约会详情。约会列表页可以像下图右边所示显示成一列。

clip_image003

                                                        图3

         要导航到指定的一周,可以点击左侧面板上的星期,相关的日期就会在右侧面板依次显示出来,然后点击一个指定的日期,在TextBox里填上约会的详细描述,相关日期的颜色就会变成紫色。要删除一个约会,删除文本框中的内容。切换到约会列表视图里,可以很清楚的看到需要关注的约会。

       我用一个简单的数据集来代表日程表。我在这里假定你对DataSet类很熟悉,这个DataSet包含2个表:AppointmentBook和Appointment,如下所示:

clip_image004

                                                 图4

        表AppiontmentBook只包含一个记录用来定义日历的开始日期(必须是星期日)和日历上星期的总数。表Appointment包含约会的日期(以天
为代表从开始日期偏移)和约会的详细信息。对一个特定日期只允许一个约会。我承认这是一个过于简单的数据模型,但是它让我们把目光更多的集中在虚拟模式的使用上,更少关注程序的细节。

该软件允许你创建一个新的约会薄或打开已有的一个。经过应用程序的设置,最后一次打开的文件会被记住。

实例中的DataRepeaters

        在程序中,我用了3个DataRepeaters,都用了虚拟模式。第一个叫WeekCalendarDataRepeater,它是用来表示左边的日历(见图2)。我不会在这个DataRepeater上做任何的数据输入,数据值(字符串值12/27,12/28,etc.)是动态计算的,因此没有必要通过一个数据缓存类来缓存这些值。这是使用虚拟模式的完美例子。在这个例子中,我将说明怎样提供数据给DataRepeater.

        第二个叫DayCalendarDataRepeater,它用来在日历视图中显示和编辑约会信息(图2右手边)。我已经将DataRepeater设置成固定范围,每一行代表一个日期,因此它不会允许你添加或者删除项目(在这里即行)。我将演示如何把数据从DataRepeater取出并存进数据缓存AppointmentDataTable中。你会发现DataRepeater的项和AppointmentDataTable的行并不是一个一对一的关系。Appointment可以由更少的项。这是另一个说明使用VirtualMode比非VirtualMode更合适的好例子。

       第三个DataRepeater叫ApptListDataRepeater,用于以列表显示约会(图3,右手边)。对这一个,没有必要对AppointmentDataTable使用VirtualMode设置DataRepeater.DataSource。然而,我仍然使用VirtualMode来说明添加和删除项的应用。

DataRepeaters的详细应用

       要正确使用DataRepeater,你需要设置DataRepeater.VirtualMode为true,设置DataRepeater.ItemCount并处理以下四项活动:ItemValueNeeded,ItemValuePushed,NewItemNeeded 和ItemsRemoved。让我们用以个例子来深入到细节。

1) 要使用DataRepeater VirtualMode,首先要做的是设置DataRepeater.VirtualMode属性为true。你可以通过属性浏览器或者像如下Form_Load事件处理那样在代码里设置。我将我所有的三个DataRepeater设置成VirtualMode。(部分代码在函数中删除,以提高可读性,其他代码段也是如此。我将在最后提供完整的样本衔接。)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles MyBase.Load

‘ Setup the Virtul Mode state for the DataRepeaters

    Me.WeekCalendarDataRepeater.VirtualMode = True

    Me.DayCalendarDataRepeater.VirtualMode = True

    Me.ApptListDataRepeater.VirtualMode = True

End Sub

2) 然后你需要告诉DataRepeater最初有多少项。在实例中,三个DataRepeater 有总周数,天数和约会数在OpenAppointmentBook函数里。

Private Sub OpenAppointmentBook()

    apptDataSet = New AppointmentDataSet()

    apptDataSet.ReadXml(dataFile)

    Dim row1 As AppointmentDataSet.AppointmentBookRow = _

    CType(apptDataSet.AppointmentBook.Rows(0), AppointmentDataSet.AppointmentBookRow)

    day0 = row1.StartDate

    totalWeeks = row1.TotalWeeks

    totalDays = totalWeeks * 7

    Me.WeekCalendarDataRepeater.ItemCount = totalWeeks

    Me.DayCalendarDataRepeater.ItemCount = totalDays

    Me.ApptListDataRepeater.ItemCount = apptDataSet.Appointment.Rows.Count

End Sub

3) 不管DataRepeaterItem说明时候需要,你都提供数据给它(例如,当滚动查看项的时候)。这通过ItemValueNeeded事件。例如,在WeekCalendarDataRepeater,我通过计算约会数和周数来为Label提供值。

Private Sub WeekCalendarDataRepeater_ItemValueNeeded(ByVal sender As Object, ByVal e As _

DataRepeaterItemValueEventArgs) Handles WeekCalendarDataRepeater.ItemValueNeeded

    Dim i As Integer = e.ItemIndex

    If (i >= 0 AndAlso i < TotalWeeks) Then

      Select Case e.Control.Name

        Case "Label1"

             e.Value = GetDate(i, 0)

        Case "Label2"

             e.Value = GetDate(i, 1)

        Case "Label3"

             e.Value = GetDate(i, 2)

        Case "Label4"

             e.Value = GetDate(i, 3)

        Case "Label5"

             e.Value = GetDate(i, 4)

        Case "Label6"

             e.Value = GetDate(i, 5)

        Case "Label7"

             e.Value = GetDate(i, 6)

        Case "WeekLabel"

             e.Value = i.ToString()

      End Select

   End If

End Sub

我没有在WeekCalendarDataRepeater中处理ItemValuePushed事件,所以它只读。

4) 当DataRepeaterItem在DataRepeater更新,你需要处理ItemValuePushed事件来保存数据。例如,在DayCalendarDataRepeater,我们收到来自DataRepeater的ApptTextBox,它存储用户刚输入的或者编辑的约会描述。我们把值存储在数据集中。

Private Sub DayCalendarDataRepeater_ItemValuePushed(ByVal sender As Object, ByVal e As _

DataRepeaterItemValueEventArgs) Handles DayCalendarDataRepeater.ItemValuePushed

    Dim i As Integer = e.ItemIndex

       If (i >= 0) Then

        Select Case e.Control.Name

          Case "ApptTextBox"

             UpdateDataSet(i, CType(e.Value, String))

       End Select

       End If

End Sub

我将WeekCalendarDataRepeater和DayCalendarDataRepeater连同AllowUserToAddItems和AllowUserToDeleteItems设置成false(见图5)所以项数是固定的,我并不需要处理NewItemNeeded和ItemsRemoved事件。

clip_image005

图5

5) 在AppListDataRepeater,我需要添加和删除约会。我使用AddButton和RemoveButton来执行添加或删除操作。点击AddButton的代码如下所示。主要的语句是ApptListDataRepeater.AddNew()。添加了错误处理代码以便如果发生什么错误它不会添加一个新行。

Private Sub ApptListDataRepeater_AddButton_Click(ByVal sender As System.Object, ByVal e As _

System.EventArgs) Handles AddButton.Click

    Dim oldCount = ApptListDataRepeater.ItemCount

    Try

      ApptListDataRepeater.AddNew()

   Catch er As Exception

     If (er.GetType.FullName <> GetType(CancleException).FullName) Then

       MessageBox.Show(er.Message)

     End If

‘ Remove the last added row

     If (ApptListDataRepeater.ItemCount > oldCount) Then

       ApptListDataRepeater.ItemCount = oldCount

       Me.TotalApptsLabel.Text = apptDataSet.Appointment.Rows.Count.ToString()

     End If

    End Try

End Sub

上面的代码将触发DataRepeater执行NewItemNeeded事件。我们如下处理:

Private Sub ApptListDataRepeater_NewItemNeeded(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles ApptListDataRepeater.NewItemNeeded

‘Raise a dialog to get a date an appoint

      Dim appointmentForm As New NewAppointmentForm

      If (appointmentForm.ShowDialog(Me) = Windows.Forms.DialogResult.OK) Then

        Me.apptDataSet.Appointment.AddAppointmentRow(appointmentForm.AppointmentDate.Subtract(day0).Days, _

             appointmentForm.Description)

        RefreshDataRepeater(Me.DayCalendarDataRepeater)

        RefreshDataRepeater(Me.WeekCalendarDataRepeater)

     Else

       Throw New CancleException

     End If

End Sub

我使用一种新的形式输入日期和详细信息用以构成一个新的约会数据项。

6) 要删除一个项,你可以使用DataRepeater.RemoveAt(index)如下:

Private Sub ApptListDataRepeater_DeleteButton_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles DeleteButton.Click

       ApptListDataRepeater.RemoveAt(ApptListDataRepeater.CurrentItemIndex)

End Sub

你还可以使用删除键达到同样的效果。同时,你需要处理ItemsRemoved事件如下:

Private Sub ApptListDataRepeater_ItemsRemoved(ByVal sender As Object, ByVal e As _

DataRepeaterAddRemoveItemsEventArgs) Handles ApptListDataRepeater.ItemsRemoved

       If (e.ItemIndex >= 0 AndAlso e.ItemIndex < apptDataSet.Appointment.Rows.Count) Then

           apptDataSet.Appointment.Rows.RemoveAt(e.ItemIndex)

       End If

End Sub

7) 最后,在我的例子中,你可能会看到我有一个函数来刷新DataRepeater。

Private Sub RefreshDataRepeater(ByRef repeater As DataRepeater)

        Debug.Assert(repeater IsNot Nothing, "repeater is not set")

        repeater.BeginResetItemTemplate()

        repeater.EndResetItemTemplate()

End Sub

当你想要DataRepeater来刷新数据的时候,例如这个例子中的DataSet,你会需要这个。请注意,DataRepeater.Invalidate是用来强行控制重绘,它不会更新数据。

小结

这里是一个对DataRepeater VirtualMode使用的小结:

1) 设置 DataRepeater.VirtualMode = true

2) 设置DataRepeater.ItemCount.

3) 处理DataRepeater.ItemValueNeeded事件来发布DataRepeater

4) 如果数据变化,调用DataRepeater.BeginResetItemTemplate和EndResetItemTemplete来刷新DataRepeater

5) 处理ItemValuePushed来保存DataRepeater中的变化

6) 调用DataRepeater.AddNew来添加一个新项并处理NewItemNeeded事件以提供新的值

7) 调用DataRepeater.RemoveAt(index)来删除一个DataRepeaterItem并处理ItemsRemoved事件来从外部数据存储中删除值。

有关完整的实例代码,请在MSDN Code Gallery里check out

http://code.msdn.microsoft.com/AppintmentBook

有关DataRepeater虚拟模式的更多信息,请参照此处的MSDN文档。

在Visual Studio 2010使用数据服务进行映射

 

[原文作者]:Beth Massi

[原文链接]:Sharing the goodness that is VB

 

    从Visual Studio 2008 Service Pack 1开始,您可以通过创建ADO.NET数据服务很容易的接触到REST风格的Web服务数据模型。所以如果您正想着搭建一个CRUD的远程数据访问层,那么这可能是你正在使用或者正在寻求的一门技术,我写了很多关于关于在VS2008的数据服务,我最喜欢的是:

针对Visual Studio 2010 和 the .NET Framework 4,我们已经将这门技术的名称改为WCF数据服务, 并且增加了一些新的特征, 其中之一就是我在这想谈的查询映射, 但是首先……

什么是查询规划?

    如果您一直在LINQ查询那么你可能已经写过很多的映射,一个映射,可以用来限制返回的成员集数量的属性,或者用来执行属性的转换,可以有选择的做到的这些。例如:我是有一个负有12个属性特征的的客户名单,但我只想在我的结果集合里显示他们夫妇的名单。我这样写:

Dim result = From c In customerList Select c.CustomerID, c.ContactName

    这将产生一个只有CustomerID和ContactName属性的匿名列表,我们说,这个查询将Customer的属性映射到匿名的类型中。你也可以将自己的结果映射到已经的类型中。例如,假设我有一个拥有两个属性特这的MyCustomer类:

Class MyCustomer

Property CustomerID As Integer

Property ContactName As String

End Class

    我也这样写这个查询来替代,以便它可以将结果映射到MyCustomer这个类的对象集中:

Dim result = From c In customerList

Select New MyCustomer With

{.CustomerID = c.CustomerID,

.ContactName = c.ContactName}

数据服务支持查询映射

    当你写一个针对数据服务的查询它将转化为一个HTTP GET调用,你可以使用LINQ数据查询服务来执行约束(Where)、排序(Order by)以及其他的一些基本表达,尽管不是支持所有的LINQ语法。遗憾的是在Visual Studio 2008 SP1中你不能使用一个查询映射(Select)到数据服务,你会得到一个NotSupportedException的错误信息,这意味着你所有在数据服务背后定义的实体模块的属性都被返回了。如果你有带有许多属性的实体或者属性中含有超负荷的属性,比如图片,或者其他一些二进制的数据,这或许是一个障碍。无论你用不用它们,所有这些都要被设置最低限。让我来告诉你我的意思:

我有一个的Northwind数据库,通过它来揭露.NET 3.5 SP1的数据服务。就像我们在以前的帖子建立实体框架模型。它具有分类和产品的实体。该类别的实体有一个Picture属性,但我不需要在我的客户端应用程序使用它。我已经添加到客户服务的引用,你会认为我们以下内容可以这么写吗:

Dim svc As New NorthwindService.NorthwindEntities(New Uri("http://…/NorthwindService.svc/"))

‘Try to project just the properties we need:

Dim result = From c In svc.Categories Select c.CategoryID, c.CategoryName

For Each c In result ‘NotSupportedException when query executes

Console.WriteLine(c)

Next

    然而,我们得到一个运行时错误“选择不支持”,为了规划属性,我们只要执行查询和降低本地数据。然后突出那个清单,我们只需要像这样增加一个调用去扩展ToList方法:
Dim result = From c In svc.Categories.ToList Select c.CategoryID, c.CategoryName

不幸的是如果你在有效载荷查看所有返回的属性,虽然结果是我们想要的,但是确实最低效的,在我们的例子中,你可以看到图片的二进制数据返回,但从来没有使用过:

clip_image002

    我们真正想要的仅仅是在有效载荷里我们要求的那部分属性,幸运的是这些已经在Visual Studio 2010 和 .NET Framework 4中被支持了,另外你也可以在.NET 3.5中安装一个更新来获得这项支持,我们先通过在Visual Studio 2010中创建一个WCF数据服务工程来体验一下这个新特性吧。

Visual Studio 2010创建新的WCF数据服

    自从设计师在VS2008上做了一些微妙的改变后,我迫不及待的想要在VS2010上创建一个WCF数据服务。创建一个新的项目并选择网络节点,然后选择ASP.NET Web应用程序空。如果你没有看到它,请确保您的目标设置为.NET框架4。这是一个新的项目模板,以方便使用,特别是如果您创建数据服务。

clip_image004

    单击确定,创建项目。它将只包含一个web.config文件。接着像以前一样添加数据模型,因为我想使用实体框架,选择工程文件 à添加新项,选择数据节点,然后选择ADO.NET实体数据模型,单击添加就完成你的数据模型的创建了。依我而言,我从Northwind数据库中生成它。

    接下来,我们需要添加WCF的数据服务(前身是闻名的ADO.NET数据服务)。项目à “添加新项”,选择网络节点,然后向下滚动并选择WCF的数据服务。在试图寻找到它之前请确信此项目模板改名为.NET 3.5和4.0框架:

clip_image006

    现在,您可以设置您的实体访问。在这个例子中,我将在模型中访问所有的实体模型:

Public Class NorthwindService
    ' TODO: replace [[class name]] with your data class name
    Inherits DataService(Of NorthwindEntities)
 
    ' This method is called only once to initialize service-wide policies.
    Public Shared Sub InitializeService(ByVal config As DataServiceConfiguration)
        ' TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        ' Examples:
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead)
        ' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All)
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2
    End Sub
 

End Class

    最后,我们将添加一个简单的客户端控制台应用程序的解决方案测试服务。文件à添加à新建项目,然后选择控制台应用程序。右键单击控制台应用程序的客户端,然后选择“添加服务引用”在Solution Explorer。当打开对话框单击按钮,应探索找到数据服务。命名服务引用,然后单击确定。这将自动生成客户端代理和必要的实体来配合我们的数据服务。

使用WCF数据服务映射

    现在我们拥有一个.NET 4.0的WCF数据服务体制,我们可以在客户端写一个指定映射查询:

Dim svc As New NorthwindEntities(New Uri("http://.../NorthwindService.svc/"))
 
'Projections now supported in WCF Data Services 
Dim result = From c In svc.Categories Select c.CategoryID, c.CategoryName
 
For Each c In result 'No errors 
    Console.WriteLine(c)
Next
 
这意味着和以前不允许指定一个select参数相反,现在数据服务被支持了。如果你想用你喜欢的浏览器打开你的刚建好的WCF数据服务,您可以在查询字符串中指定一个查询分句:
http://…/NorthwindService.svc/Categories?$select=CategoryID,CategoryName
 

    现在如果你去查看有效负载,我们可以看到,只有CategoryID,CategoryName从服务端返回回来,这样就保护了系统资源。

clip_image008

    欲了解更多有关使用数据服务查询映射信息,请参阅MSDN LibraryWCF Data Services Team Blog