在枚举文件夹中的项时筛选并显示计算属性
此示例演示如何在枚举文件夹中的项目时筛选和显示计算属性。
示例
注意
下面的代码示例摘录自 Microsoft Office Outlook 2007 应用程序编程。
Table 对象表示 Folder 或 Search 对象中的一组项目数据。 Row 对象表示 Table 中的数据行。 Columns 对象表示 Table 的属性。 可以使用 Columns 对象的 Add (String) 方法向 Table 对象添加某些属性。 可以使用 Table 对象的 Restrict (String) 方法筛选某些属性。 但是,有些属性既无法通过使用 Columns.Add 添加到 Table 对象中,也无法通过使用 Restrict 方法进行筛选。 下表描述在使用 Columns.Add 或 Restrict 方法时 Table 对象对属性的支持性。
属性 |
使用 Columns.Add 时 |
使用 Restrict 时 |
---|---|---|
二进制属性,如 EntryID。 |
通过内置或命名空间属性提供支持。 |
不支持。 Outlook 将引发错误。 |
正文属性,包括 Body 和 HTMLBody 以及这些属性的命名空间表示形式(包括 PR_RTF_COMPRESSED)。 |
满足以下条件时支持 Body 属性:只有相应值的前 255 个字节存储在 Table 对象中。 不支持以 HTML 或 RTF 格式表示正文内容的其他属性。 因为系统将仅返回 Body 的前 255 个字节,如果你想以文本或 HTML 格式获取某个项目的全部正文内容,请在 GetItemFromID(String, Object) 方法中使用该项目的 EntryID 来获取项目对象。 然后,在整个项目对象中检索 Body 的完整值。 |
筛选器只支持以文本形式表示的 Body 属性。 这意味着在 DAV 搜索和定位 (DASL) 筛选器中必须将该属性作为 urn:schemas:http-mail:textdescription 进行引用,而且您无法对正文中的任何 HTML 标记进行筛选。 为了提高性能,请在筛选器中使用内容索引器关键字来匹配正文中的字符串。 |
计算机属性,如 AutoResolvedWinner 和 BodyFormat。 |
不支持。 |
不支持。 |
多值属性,如 Categories、Children、Companies 和 VotingOptions。 |
支持。 |
支持,前提是你能够使用命名空间表示形式创建 DASL 查询。 |
用于返回某个对象的属性,如 Attachments、Parent、Recipients、RecurrencePattern 和 UserProperties。 |
不支持。 |
不支持。 |
下表列出了无法通过使用 Columns.Add 添加到 Table 对象中的已知无效属性。 如果尝试从此列表中添加属性,则 Outlook 将引发错误。
AutoResolvedWinner |
BodyFormat |
类 |
Companies |
ContactNames |
DLName |
DownloadState |
FlagIcon |
HtmlBody |
InternetCodePage |
IsConflict |
IsMarkedAsTask |
MeetingWorkspaceURL |
MemberCount |
Permission |
PermissionService |
RecurrenceState |
ResponseState |
Saved |
发件箱 |
已提交 |
TaskSubject |
未读 |
VotingOptions |
虽然一些计算属性无法添加到为表格设置的列,但是下面的代码示例可以克服这个限制。 GetToDoItems 使用 DASL 查询来限制出现在 Table 中的项目。 如果计算属性采用命名空间表示形式,则命名空间表示形式将用于创建 DASL 查询,该查询将 Table 对象限制为返回计算属性的指定值所在的行。 GetToDoItem 获取收件箱中 IsMarkedAsTask 属性值等于 true 的项目,然后将这些值分配给特定的任务属性,如 TaskSubject、TaskDueDate、TaskStartDate 和 TaskCompletedDate。 最后,这些属性都将被写入 Listeners 集合的跟踪侦听器中。
如果使用 Visual Studio 测试此代码示例,必须先添加对 Microsoft Outlook 15.0 对象库组件的引用,并在导入 Microsoft.Office.Interop.Outlook 命名空间时指定 Outlook 变量。 不得将 using 语句直接添加到此代码示例中的函数前面,这个语句必须后跟公共类声明。 下面的代码行演示了如何在 C# 中执行导入和分配。
using Outlook = Microsoft.Office.Interop.Outlook;
private void GetToDoItems()
{
// Obtain Inbox
Outlook.Folder folder =
Application.Session.GetDefaultFolder(
Outlook.OlDefaultFolders.olFolderInbox)
as Outlook.Folder;
// DASL filter for IsMarkedAsTask
string filter = "@SQL=" + "\"" +
"http://schemas.microsoft.com/mapi/proptag/0x0E2B0003"
+ "\"" + " = 1";
Outlook.Table table =
folder.GetTable(filter,
Outlook.OlTableContents.olUserItems);
table.Columns.Add("TaskStartDate");
table.Columns.Add("TaskDueDate");
table.Columns.Add("TaskCompletedDate");
// Use GUID/ID to represent TaskSubject
table.Columns.Add(
"http://schemas.microsoft.com/mapi/id/" +
"{00062008-0000-0000-C000-000000000046}/85A4001E");
while (!table.EndOfTable)
{
Outlook.Row nextRow = table.GetNextRow();
StringBuilder sb = new StringBuilder();
sb.AppendLine("Task Subject: " + nextRow[9]);
sb.AppendLine("Start Date: "
+ nextRow["TaskStartDate"]);
sb.AppendLine("Due Date: "
+ nextRow["TaskDueDate"]);
sb.AppendLine("Completed Date: "
+ nextRow["TaskCompletedDate"]);
sb.AppendLine();
Debug.WriteLine(sb.ToString());
}
}