演练:导入在 Outlook 中设计的窗体区域

更新:2007 年 11 月

适用对象

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

项目类型

  • 应用程序级项目

Microsoft Office 版本

  • Outlook 2007

有关更多信息,请参见按应用程序和项目类型提供的功能

此演练演示如何在 Microsoft Office Outlook 中设计窗体区域,然后通过使用“新建窗体区域”向导将该窗体区域导入到 Visual Studio Tools for Office Outlook 外接程序项目中。通过在 Outlook 中设计窗体区域,您可以将本机 Outlook 控件添加到绑定到 Outlook 数据的窗体区域中。导入窗体区域后,就可以处理每个控件的事件。

本演练阐释以下任务:

  • 使用 Outlook 中的窗体区域设计器设计一个窗体区域。

  • 将窗体区域导入 Outlook 外接程序项目。

  • 处理窗体区域上的控件的事件。

Bb608611.alert_note(zh-cn,VS.90).gif说明:

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置

先决条件

您需要以下组件来完成本演练:

  • Visual Studio Tools for Office(Visual Studio 2008 专业版 和 Visual Studio Team System 的可选组件)。

  • Microsoft Office Outlook 2007。

Bb608611.alert_note(zh-cn,VS.90).gif说明:

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。您安装的 Visual Studio 版本以及使用的设置决定了这些元素。有关更多信息,请参见 Visual Studio 设置

使用 Outlook 中的窗体区域设计器设计窗体区域

此步骤将在 Outlook 中设计一个窗体区域。然后将该窗体区域保存到一个易于查找的位置,以便可将其导入 Visual Studio。

此示例窗体区域将完全替换常规的“任务”窗体。它提供了一种方法来跟踪在可以执行主任务之前必须完成的所有任务(系统必备任务)的进度。该窗体区域显示了一个系统必备任务的列表,并显示列表中每项任务的完成状态。用户可将任务添加到列表或将它们从中移除。还可以刷新每项任务的完成状态。

使用 Outlook 中的窗体区域设计器设计窗体区域

  1. 启动 Microsoft Office Outlook 2007。

  2. 在“工具”菜单上指向“窗体”,再单击“设计窗体”。

  3. 在“设计窗体”框中,单击“任务”,再单击“打开”。

  4. 在“开发工具”选项卡上的“设计”组中,单击“窗体区域”,再单击“新建窗体区域”。

    将打开一个新的窗体区域。如果未出现“字段选择器”,请在“工具”组中单击“字段选择器”。

  5. 将“主题”字段和“% 已经完成”字段从“字段选择器”拖动到该窗体区域中。

  6. 在“工具”组中,单击“控件工具箱”打开“工具箱”。

  7. 将 Label 从“工具箱”拖入窗体区域。将该标签放置在“主题”和“% 已经完成”字段下面。

  8. 右击该标签,然后单击“高级属性”。

  9. 在“属性”窗口中,将“Caption”属性设置为“此任务依赖于下列任务”,将“Width”属性设置为“200”,然后单击“应用”。

  10. 将 ListBox 控件从“工具箱”拖入窗体区域。将该列表框放置在“此任务依赖于下列任务”标签下面。

  11. 选择刚刚添加的列表框。

  12. 在“属性”窗口中,将“Width”设置为“300”,然后单击“应用”。

  13. 将 Label 从“工具箱”拖入窗体区域。将该标签控件放置在列表框下面。

  14. 选择刚刚添加的标签。

  15. 在“属性”窗口中,将“Caption”属性设置为“选择要添加到依赖任务列表中的任务”,将“Width”属性设置为“200”,然后单击“应用”。

  16. 将 ComboBox 控件从“工具箱”拖入窗体区域。将该组合框放置在“选择要添加到依赖任务列表中的任务”标签下面。

  17. 选择刚刚添加的组合框。

  18. 在“属性”窗口中,将“Width”属性设置为“300”,然后单击“应用”。

  19. 从“工具箱”中将一个 CommandButton 控件拖动到该窗体区域中。将该命令按钮放置在组合框旁边。

  20. 选择刚刚添加的命令按钮。

  21. 在“属性”窗口中,将“Name”设置为“AddDependentTask”,将“Caption”设置为“添加依赖任务”,将“Width”设置为“100”,然后单击“应用”。

  22. 在“字段选择器”中,单击“新建”。

  23. 在“新建字段”对话框中,在“Name”字段中键入“hiddenField”,然后单击“确定”。

  24. 将“hiddenField”字段从“字段选择器”拖入窗体区域。

  25. 在“属性”窗口中,将“Visible”设置为“0 – False”,然后单击“应用”。

  26. 在“开发工具”选项卡上的“设计”组中,单击“窗体区域”,再单击“窗体区域另存为”。将该窗体区域命名为“TaskFormRegion”,然后将其保存在计算机上某个本地目录中。

    Outlook 将该窗体区域另存为 Outlook 窗体存储 (.ofs) 文件。该窗体区域将以名称 TaskFormRegion.ofs 保存。

  27. 退出 Outlook。

创建新的 Outlook 外接程序项目

此步骤中将创建一个 Outlook 外接程序项目。在此演练稍后的部分,将把窗体区域导入该项目。

创建新的 Outlook 外接程序项目

  1. 在 Visual Studio 中,创建一个名为“TaskAddIn”的 Outlook 2007 外接程序项目。

  2. 在“新建项目”对话框中选择“创建解决方案的目录”。

  3. 将项目保存到默认项目目录中。

    有关更多信息,请参见如何:创建 Visual Studio Tools for Office 项目

导入窗体区域

使用“新建 Outlook 窗体区域”向导可将在 Outlook 中设计的窗体区域导入 Outlook 外接程序项目。

将窗体区域导入 Outlook 外接程序项目

  1. 在“解决方案资源管理器”中,右击“TaskAddIn”项目,指向“添加”,再单击“新建项”。

  2. 在“模板”窗格中,选择“Outlook 窗体区域”,将文件命名为“TaskFormRegion”,然后单击“添加”。

    “新建 Outlook 窗体区域”向导启动。

  3. 在“选择窗体区域的创建方式”页上,单击“导入 Outlook 窗体存储(.ofs)文件”,然后单击“浏览”。

  4. 在“现有 Outlook 窗体区域文件的位置”对话框中,浏览到“TaskFormRegion.ofs”所在的位置,选择“TaskFormRegion.ofs”,单击“打开”,然后单击“下一步”。

  5. 在“选择要创建的窗体区域的类型”页上,单击“全部替换”,然后单击“下一步”。

    “全部替换”窗体区域将替换整个 Outlook 窗体。有关窗体区域类型的更多信息,请参见创建 Outlook 窗体区域

  6. 在“提供说明性文本并选择显示首选项”页上,单击“下一步”。

  7. 在“标识将显示此窗体区域的邮件类”页上的“哪些自定义邮件类将显示此窗体区域”字段中,键入“IPM.Task.TaskFormRegion”,然后单击“完成”。

    TaskFormRegion.cs 或 TaskFormRegion.vb 文件添加到项目中。

处理窗体区域上的控件的事件

现在项目中已经有了窗体区域,可以添加代码来处理添加到 Outlook 窗体区域中的按钮的 Microsoft.Office.Interop.Outlook.OlkCommandButton.Click 事件。

此外,还可以对 FormRegionShowing 事件添加在窗体区域出现时更新窗体区域中的控件的代码。

处理窗体区域上的控件的事件

  1. 在“解决方案资源管理器”中,右击 TaskFormRegion.cs 或 TaskFormRegion.vb,然后单击“查看代码”。

    TaskFormRegion.cs 或 TaskFormRegion.vb 在代码编辑器中打开。

  2. 向 TaskFormRegion 类中添加下面的代码。这段代码将 Outlook“任务”文件夹中每项任务的主题行填入窗体区域上的组合框中。

    Private Sub populateComboBox()
        Dim Application As New Outlook.Application()
        Dim outlookNameSpace As Outlook.NameSpace = _
        Application.GetNamespace("MAPI")
        Dim taskFolder As Outlook.MAPIFolder = _
        outlookNameSpace.GetDefaultFolder _
            (Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks)
        Dim taskItems As Outlook.Items = taskFolder.Items
        Dim task As Outlook.TaskItem
        For Each task In taskItems
            If Not (task.Subject Is Nothing) Then
                comboBox1.AddItem(task.Subject, System.Type.Missing)
            End If
        Next task
        comboBox1.Text = comboBox1.GetItem(0)
    End Sub
    
    private void populateComboBox()
    {
        Outlook.Application Application = new Outlook.Application();
        Outlook.NameSpace outlookNameSpace = Application.GetNamespace("MAPI");
        Outlook.MAPIFolder taskFolder = outlookNameSpace.GetDefaultFolder(
            Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks);
        Outlook.Items taskItems = taskFolder.Items;
        foreach (Outlook.TaskItem task in taskItems)
        {
            if (task.Subject != null)
            {
                comboBox1.AddItem(task.Subject, System.Type.Missing);
            }
        }
        comboBox1.Text = comboBox1.GetItem(0);
    }
    
  3. 向 TaskFormRegion 类中添加下面的代码。这段代码执行下列任务:

    • 通过调用 FindTaskBySubjectName 帮助器方法并传入所要任务的主题来找到“任务”文件夹中的 Microsoft.Office.Interop.Outlook.TaskItem。下一步将添加 FindTaskBySubjectName 帮助器方法。

    • Microsoft.Office.Interop.Outlook.TaskItem.SubjectMicrosoft.Office.Interop.Outlook.TaskItem.PercentComplete 值添加到依赖任务列表框中。

    • 将任务的主题添加到窗体区域上的隐藏字段中。隐藏字段将这些值作为 Outlook 项的一部分存储。

    Private Sub AddDependentTask_Click1() Handles addDependentTask.Click
        Dim tempTaskItem As Outlook.TaskItem = FindTaskBySubjectName _
            (comboBox1.Text)
        If Not (tempTaskItem Is Nothing) Then
            Me.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() & _
                "% Complete -- " & tempTaskItem.Subject, System.Type.Missing)
            Me.olkTextBox3.Text = Me.olkTextBox3.Text & "|" & tempTaskItem.Subject
        End If
    End Sub
    
        void AddDependentTask_Click()
        {
            Outlook.TaskItem tempTaskItem = FindTaskBySubjectName(comboBox1.Text);
            if (tempTaskItem != null)
            {
                this.listBox1.AddItem(tempTaskItem.PercentComplete.ToString()
    + "% Complete -- " + tempTaskItem.Subject, System.Type.Missing);
                this.olkTextBox3.Text = this.olkTextBox3.Text + "|" + 
                    tempTaskItem.Subject;
            }
        }
    
  4. 向 TaskFormRegion 类中添加下面的代码。这段代码提供了在上一步中所述的帮助器方法 FindTaskBySubjectName。

    Private Function FindTaskBySubjectName(ByVal subjectName As String) _
        As Outlook.TaskItem
        Dim Application As New Outlook.Application()
        Dim outlookNameSpace As Outlook.NameSpace = _
            Application.GetNamespace("MAPI")
        Dim tasksFolder As Outlook.MAPIFolder = _
            outlookNameSpace.GetDefaultFolder _
                (Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks)
        Dim taskItems As Outlook.Items = tasksFolder.Items
        Dim taskItem As Outlook.TaskItem
        For Each taskItem In taskItems
            If taskItem.Subject = subjectName Then
                Return taskItem
            End If
        Next taskItem
        Return Nothing
    End Function
    
    private Outlook.TaskItem FindTaskBySubjectName(string subjectName)
    {
        Outlook.Application Application = new Outlook.Application();
        Outlook.NameSpace outlookNameSpace = Application.GetNamespace("MAPI");
        Outlook.MAPIFolder tasksFolder =
            outlookNameSpace.GetDefaultFolder(
        Microsoft.Office.Interop.Outlook.
            OlDefaultFolders.olFolderTasks);
        Outlook.Items taskItems = tasksFolder.Items;
        foreach (Outlook.TaskItem taskItem in taskItems)
        {
            if (taskItem.Subject == subjectName)
            {
                return taskItem;
            }
        }
        return null;
    }
    
  5. 向 TaskFormRegion 类中添加下面的代码。这段代码执行下列任务:

    • 刷新窗体区域中的列表框获得每项依赖任务的当前完成状态。

    • 分析隐藏文本字段以获取每项依赖任务的主题。然后这段代码通过调用 FindTaskBySubjectName 帮助器方法并传入每项任务的主题来找到“任务”文件夹中的每项 Microsoft.Office.Interop.Outlook.TaskItem

    • Microsoft.Office.Interop.Outlook.TaskItem.SubjectMicrosoft.Office.Interop.Outlook.TaskItem.PercentComplete 值添加到依赖任务列表框中。

    Private Sub RefreshTaskListBox()
        listBox1.Clear()
        Dim tempTaskItem As Outlook.TaskItem
        Dim tempArray As [String]() = olkTextBox3.Text.Split(New [Char]() {"|"c})
    
        Dim tempString As String
        For Each tempString In tempArray
            tempTaskItem = FindTaskBySubjectName(tempString)
            If Not (tempTaskItem Is Nothing) Then
                Me.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() & _
                    "% Complete -- " & tempTaskItem.Subject, System.Type.Missing)
            End If
        Next tempString
    End Sub
    
    void RefreshTaskListBox()
    {
        listBox1.Clear();
        Outlook.TaskItem tempTaskItem;
        String[] tempArray = olkTextBox3.Text.Split(new Char[] { '|' });
    
        foreach (string tempString in tempArray)
        {
            tempTaskItem = FindTaskBySubjectName(tempString);
            if (tempTaskItem != null)
            {
                this.listBox1.AddItem(tempTaskItem.PercentComplete.ToString()
                    + "% Complete -- " + tempTaskItem.Subject, 
                        System.Type.Missing);
            }
        }
    }
    
  6. 用下面的代码替换 TaskFormRegion_FormRegionShowing 事件处理程序。这段代码执行下列任务:

    • 当窗体区域出现时,将任务主题填入窗体区域中的组合框。

    • 在窗体区域出现时调用 RefreshTaskListBox 帮助器方法。这将显示先前在打开项时添加到列表框中的任何依赖任务。

    Private Sub TaskFormRegion_FormRegionShowing(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.FormRegionShowing
        populateComboBox()
        RefreshTaskListBox()
    End Sub
    
    private void TaskFormRegion_FormRegionShowing
        (object sender, EventArgs e)
    {
        populateComboBox();
        RefreshTaskListBox();
        this.addDependentTask.Click += new
        Microsoft.Office.Interop.Outlook.
            OlkCommandButtonEvents_ClickEventHandler(AddDependentTask_Click);
    
    }
    

测试 Outlook 窗体区域

若要测试窗体区域,请将任务添加到窗体区域中的系统必备任务列表中。更新系统必备任务的完成状态,然后查看系统必备任务列表中的任务更新后的完成状态。

测试窗体区域

  1. 按 F5 运行项目。

    Outlook 即会启动。

  2. 在 Outlook 中,在“文件”菜单上,指向“新建”,再单击“任务”。

  3. 在任务窗体中的在“主题”字段内,键入“依赖任务”。

  4. 在功能区“任务”选项卡上的“操作”组中单击“保存并关闭”。

  5. 在 Outlook 中的“文件”菜单上,指向“新建”,然后单击“选择窗体”。

  6. 在“选择窗体”对话框中,单击“TaskFormRegion”,然后单击“打开”。

    “TaskFormRegion”窗体区域出现。此窗体将替换整个任务窗体。“选择要添加到依赖任务列表中的任务”组合框中填入了“任务”文件夹中的其他任务。

  7. 在任务窗体上的“主题”字段中,键入“主任务”。

  8. 在“选择要添加到依赖任务列表中的任务”组合框中,选择“依赖任务”,然后单击“添加依赖任务”。

    “0% 已经完成 -- 依赖任务”出现在“此任务依赖于下列任务”列表框中。这表明已经成功处理了该按钮的 Microsoft.Office.Interop.Outlook.OlkCommandButton.Click 事件。

  9. 保存并关闭“主任务”项。

  10. 在 Outlook 中重新打开“依赖任务”项。

  11. 在“依赖任务”窗体中,将“% 已经完成”字段更改为“50%”。

  12. 在“依赖任务”功能区的“任务”选项卡上的“操作”组中单击“保存并关闭”。

  13. 在 Outlook 中重新打开“主任务”项。

    “已完成 50% -- 依赖任务”现在出现在“此任务依赖于下列任务”列表框中。

后续步骤

有关如何自定义 Outlook 应用程序用户界面的更多信息,请参见以下主题:

请参见

任务

演练:设计 Outlook 窗体区域

如何:向 Outlook 外接程序项目中添加窗体区域

如何:防止 Outlook 显示窗体区域

如何:访问显示窗体区域的 Outlook 项

概念

在运行时访问窗体区域

创建 Outlook 窗体区域

Outlook 窗体区域创建准则

将窗体区域与 Outlook 邮件类关联

Outlook 窗体区域中的自定义操作