Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Actualización: noviembre 2007
Se aplica a |
|---|
La información de este tema sólo se aplica a los proyectos y versiones especificados de Visual Studio Tools para Office de Microsoft Office. Tipo de proyecto
Versión de Microsoft Office
Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto. |
En este tutorial se muestra cómo utilizar el modelo de objetos de la cinta de opciones para actualizar sus controles una vez cargada la cinta de opciones en la aplicación de Office.
En el ejemplo, se extraen los datos de la base de datos de ejemplo AdventureWorks para rellenar un cuadro combinado y un menú en Microsoft Office Outlook.
En este tutorial se muestran las siguientes tareas:
Crear un nuevo proyecto de complemento de Outlook.
Diseñar un grupo personalizado de la cinta de opciones.
Agregar el grupo personalizado a una ficha integrada.
Actualizar los controles de la cinta de opciones en tiempo de ejecución.
Nota: |
|---|
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que tenga y la configuración que esté utilizando determinan estos elementos. Para obtener más información, vea Valores de configuración de Visual Studio. |
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio Tools para Office (componente opcional de Visual Studio 2008 Professional y Visual Studio Team System).
Microsoft Office Outlook 2007.
Acceso a la base de datos de ejemplo AdventureWorks para SQL Server Express. Para obtener más información sobre cómo instalar la base de datos de ejemplo AdventureWorks, vea Visita guiada: Instalar la base de datos AdventureWorks.
Visual Studio Tools para Office se instala de forma predeterminada con las versiones mostradas de Visual Studio. Para comprobar si está instalado, consulte Instalar Visual Studio Tools para Office.
Crear un nuevo proyecto de complemento de Outlook
Primero, cree un proyecto de complemento de Outlook.
Para crear un nuevo proyecto de complemento de Outlook
En Visual Studio, cree un proyecto de complemento de Outlook 2007 con el nombre MyOutlookAddIn.
En el cuadro de diálogo Nuevo proyecto, seleccione Crear directorio para la solución.
Guarde el proyecto en el directorio de proyectos predeterminado.
Para obtener más información, vea Cómo: Crear proyectos de Visual Studio para Office.
Diseñar un grupo personalizado de la cinta de opciones
La cinta de opciones no aparece en el principal área de interfaz de Outlook, por lo que la cinta de opciones de este ejemplo aparecerá cuando un usuario redacte un nuevo mensaje de correo. Para crear un grupo personalizado en la cinta de opciones, primero agregue un elemento de cinta de opciones al proyecto y, a continuación, diseñe el grupo en el Diseñador de la cinta de opciones. Este grupo personalizado ayudará a generar mensajes de correo electrónico de seguimiento extrayendo los nombres e historiales de pedidos de la base de datos.
Para diseñar un grupo personalizado
En el menú Proyecto, haga clic en Agregar nuevo elemento.
En el cuadro de diálogo Agregar nuevo elemento, seleccione Cinta (diseñador visual).
Cambie el nombre de la nueva cinta de opciones a CustomerRibbon y, a continuación, haga clic en Agregar.
El archivo CustomerRibbon.cs o CustomerRibbon.vb se abre en el Diseñador de la cinta de opciones y muestra una ficha y un grupo predeterminados.
Haga clic en el Diseñador de la cinta de opciones para seleccionarlo.
En el menú Ver, haga clic en Ventana Propiedades.
En la ventana Propiedades, haga clic en la flecha desplegable situada junto a la propiedad RibbonType y, a continuación, haga clic en Microsoft.Outlook.Mail.Compose.
De este modo, la cinta de opciones aparecerá cuando el usuario redacte un nuevo mensaje de correo en Outlook.
En el Diseñador de la cinta de opciones, haga clic en Grupo1 para seleccionarlo.
En la ventana Propiedades , establezca Label en Compras del cliente.
Desde la ficha Controles de la cinta de opciones de Office del Cuadro de herramientas, arrastre un control ComboBox hasta el grupo Compras del cliente.
Haga clic en ComboBox1 para seleccionarlo.
En la ventana Propiedades , establezca Label en Clientes.
Desde la ficha Controles de la cinta de opciones de Office del Cuadro de herramientas, arrastre un control Menu hasta el grupo Compras del cliente.
En la ventana Propiedades, establezca Label en Producto comprado.
Establezca Dynamic en true.
De este modo, se pueden agregar y quitar controles del menú en tiempo de ejecución después de que se haya cargado la cinta de opciones en la aplicación de Office.
Agregar el grupo personalizado a una ficha integrada
Una ficha integrada es una ficha que ya está en la cinta de opciones de un inspector de Outlook. En este procedimiento, va a agregar el grupo personalizado a una ficha integrada y, a continuación, va a especificar la posición del grupo personalizado en la ficha.
Para agregar el grupo personalizado a una ficha integrada
Haga clic en la ficha TabAddins (Built-In) para seleccionarla.
En la ventana Propiedades, expanda la propiedad ControlId y, a continuación, establezca OfficeId en TabNewMailMessage.
De este modo, se agrega el grupo Compras del cliente a la ficha Mensajes de la cinta de opciones que aparece en un nuevo mensaje de correo.
Haga clic en el grupo Compras del cliente para seleccionarlo.
En la ventana Propiedades, expanda la propiedad Position, haga clic en la flecha desplegable situada junto a la propiedad PositionType y, a continuación, haga clic en BeforeOfficeId.
Establezca la propiedad OfficeId en GroupClipBoard.
De este modo, se coloca el grupo Compras del cliente delante del grupo Portapapeles en la ficha Mensajes.
Actualizar controles del grupo personalizado en tiempo de ejecución
Utilice el modelo de objetos de la cinta de opciones para realizar las tareas siguientes:
Agregar nombres de cliente al cuadro combinado Clientes.
Agregar controles de menú y de casilla al menú Productos comprados que representen los pedidos y productos vendidos.
Rellenar los campos Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject y Microsoft.Office.Interop.Outlook.MailItem.Body de los nuevos mensajes de correo utilizando los datos del cuadro combinado Clientes y del menú Productos comprados.
Para actualizar los controles del grupo personalizado mediante el modelo de objetos de la cinta de opciones
En el menú Proyecto, haga clic en Agregar referencia.
En el cuadro de diálogo Agregar referencia, haga clic en la ficha .NET, seleccione el ensamblado System.Data.Linq y, a continuación, haga clic en Aceptar.
Este ensamblado contiene las clases para utilizar Language-Integrated Query (LINQ). Va a usar LINQ para rellenar los controles del grupo personalizado con datos de la base de datos AdventureWorks. Para obtener más información acerca de LINQ, vea Language-Integrated Query (LINQ).
En el Explorador de soluciones, haga clic en el archivo CustomerRibbon.cs o CustomerRibbon.vb para seleccionarlo.
En el menú Ver, haga clic en Código.
Se abre el archivo de código de la cinta de opciones en el editor de código.
Agregue las siguientes instrucciones a la parte superior del archivo de código de la cinta de opciones. Estas instrucciones proporcionan acceso fácil a los espacios de nombres LINQ y al espacio de nombres del ensamblado de interoperabilidad primario (PIA) de Outlook.
Imports Microsoft.Office.Tools.Ribbon Imports System.Data.Linq Imports System.Linq Imports System.Data.Linq.Mapping Imports System.Linq.Expressions Imports Outlook = Microsoft.Office.Interop.Outlookusing System.Data.Linq; using System.Linq; using System.Data.Linq.Mapping; using System.Linq.Expressions; using Outlook = Microsoft.Office.Interop.Outlook; using System.IO;Agregue las siguientes clases al archivo de código de la cinta de opciones. Va a usar estas clases para almacenar la información de las tablas Customer, Contact, Sales Order Header, Sales Order Detail y Product de la base de datos AdventureWorks.
' Customer Table. <Table(Name:="Sales.Customer")> _ Public Class Customer <Column(IsPrimaryKey:=True)> _ Public CustomerID As Integer End Class ' Contact Table. <Table(Name:="Person.Contact")> _ Public Class Contact <Column(IsPrimaryKey:=True)> _ Public ContactID As Integer <Column()> _ Public LastName As String End Class ' Sales Order Header Table. <Table(Name:="Sales.SalesOrderHeader")> _ Public Class SalesOrderHeader <Column(IsPrimaryKey:=True)> _ Public SalesOrderID As Integer <Column()> _ Public SalesOrderNumber As String <Column()> _ Public CustomerID As Integer End Class ' Sales Order Detail Table. <Table(Name:="Sales.SalesOrderDetail")> _ Public Class SalesOrderDetail <Column(IsPrimaryKey:=True)> _ Public SalesOrderDetailID As Integer <Column()> _ Public SalesOrderID As Integer <Column()> _ Public ProductID As Integer End Class ' Product Table. <Table(Name:="Production.Product")> _ Public Class Product <Column(IsPrimaryKey:=True)> _ Public ProductID As Integer <Column()> _ Public Name As String End Class ' Data Context Class. Partial Public Class AdventureWorks Inherits DataContext Public Customer As Table(Of Customer) Public Contact As Table(Of Contact) Public SalesOrderHeader As Table(Of SalesOrderHeader) Public SalesOrderDetail As Table(Of SalesOrderDetail) Public Product As Table(Of Product) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class// Customer Table. [Table(Name = "Sales.Customer")] public class Customer { [Column(IsPrimaryKey = true)] public int CustomerID; } // Contact Table. [Table(Name = "Person.Contact")] public class Contact { [Column(IsPrimaryKey = true)] public int ContactID; [Column] public string LastName; } // Sales Order Header Table. [Table(Name = "Sales.SalesOrderHeader")] public class SalesOrderHeader { [Column(IsPrimaryKey = true)] public int SalesOrderID; [Column] public string SalesOrderNumber; [Column] public int CustomerID; } // Sales Order Detail Table. [Table(Name = "Sales.SalesOrderDetail")] public class SalesOrderDetail { [Column(IsPrimaryKey = true)] public int SalesOrderDetailID; [Column] public int SalesOrderID; [Column] public int ProductID; } // Product Table. [Table(Name = "Production.Product")] public class Product { [Column(IsPrimaryKey = true)] public int ProductID; [Column] public string Name; } // Data Context Table. public partial class AdventureWorks : DataContext { public Table<Customer> Customer; public Table<Contact> Contact; public Table<SalesOrderHeader> SalesOrderHeader; public Table<SalesOrderDetail> SalesOrderDetail; public Table<Product> Product; public AdventureWorks(string connection) : base(connection) { } }Reemplace el método de control de eventos CustomerRibbon_Load con el código siguiente. Este código utiliza una consulta LINQ para realizar las tareas siguientes:
Rellenar el cuadro combinado Clientes con el identificador y el nombre de 20 clientes de la base de datos AdventureWorks.
Llamar al método auxiliar PopulateSalesOrderInfo. Este método actualiza el menú Productos comprados con los números de pedido correspondientes al cliente actualmente seleccionado.
Private Sub CustomerRibbon_Load(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonUIEventArgs) _ Handles MyBase.Load Dim programFilesDir As String = Environment.GetFolderPath _ (Environment.SpecialFolder.ProgramFiles) Dim db As New AdventureWorks(programFilesDir + _ "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf") Dim customerQuery = From customers In db.Customer.Take(20), contact In db.Contact _ Where customers.CustomerID = contact.ContactID _ Select CustomerID = customers.CustomerID, LastName = _ contact.LastName ' Execute the query. For Each item In customerQuery Me.ComboBox1.Items.Add(New RibbonDropDownItem()) Me.ComboBox1.Items.Last().Label = item.CustomerID.ToString() _ + "|" + item.LastName Next item Me.ComboBox1.Text = Me.ComboBox1.Items.First().Label PopulateSalesOrderInfo() End Subprivate void CustomerRibbon_Load(object sender, RibbonUIEventArgs e) { string programFilesDir = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); AdventureWorks db = new AdventureWorks (programFilesDir + "\\Microsoft SQL Server\\" + "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf"); var customerQuery = from customers in db.Customer.Take(20) join contacts in db.Contact on customers.CustomerID equals contacts.ContactID select new { customers.CustomerID, contacts.LastName }; // Execute the query. foreach (var item in customerQuery) { this.comboBox1.Items.Add(new RibbonDropDownItem()); this.comboBox1.Items.Last().Label = item.CustomerID.ToString() + "|" + item.LastName; } this.comboBox1.Text = this.comboBox1.Items.First().Label; PopulateSalesOrderInfo(); }Agregue el código siguiente a la clase CustomerRibbon. Este código utiliza consultas LINQ para realizar las tareas siguientes:
Agregar un submenú al menú Productos comprados por cada pedido relacionado con el cliente seleccionado.
Agregar casillas a cada submenú para los productos relacionados con el pedido.
Agregar controladores de eventos a cada casilla.
Private Sub PopulateSalesOrderInfo() Dim tempArray As [String]() = comboBox1.Text.Split(New [Char]() {"|"c}) Menu1.Items.Clear() Dim programFilesDir As String = Environment.GetFolderPath _ (Environment.SpecialFolder.ProgramFiles) Dim db As New AdventureWorks(programFilesDir + _ "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf") Dim orderQuery = From orders In db.SalesOrderHeader _ Where orders.CustomerID.ToString() = tempArray(0) _ Select SalesOrderID = _ orders.SalesOrderID, SalesOrderNumber = _ orders.SalesOrderNumber For Each orderItem In orderQuery Dim Menu2 As New RibbonMenu() Menu2.Dynamic = True Menu1.Items.Add(Menu2) CType(Menu1.Items.Last(), RibbonMenu).Label = _ orderItem.SalesOrderNumber.ToString() CType(Menu1.Items.Last(), RibbonMenu).Tag = _ orderItem.SalesOrderID Dim productQuery = From orderDetail In db.SalesOrderDetail, _ product In db.Product _ Where orderDetail.ProductID = _ product.ProductID _ And orderDetail.SalesOrderID = _ orderItem.SalesOrderID _ Select productName = product.Name For Each productItem In productQuery CType(Menu1.Items.Last(), RibbonMenu).Items.Add _ (New RibbonCheckBox()) CType(CType(Menu1.Items.Last(), _ RibbonMenu).Items.Last(), RibbonCheckBox).Label = productItem AddHandler (CType(CType(Menu1.Items.Last(), _ RibbonMenu).Items.Last(), RibbonCheckBox).Click), AddressOf CheckBox_Click Next productItem Next orderItem End Subprivate void PopulateSalesOrderInfo() { String[] tempArray = comboBox1.Text.Split(new Char[] { '|' }); menu1.Items.Clear(); string programFilesDir = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); AdventureWorks db = new AdventureWorks (programFilesDir + "\\Microsoft SQL Server\\" + "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf"); var orderQuery = from orders in db.SalesOrderHeader where orders.CustomerID.ToString() == tempArray[0] select new { orders.SalesOrderID, orders.SalesOrderNumber }; foreach (var orderItem in orderQuery) { RibbonMenu menu2 = new RibbonMenu(); menu2.Dynamic = true; menu1.Items.Add(menu2); ((RibbonMenu)menu1.Items.Last()).Label = orderItem.SalesOrderNumber.ToString(); ((RibbonMenu)menu1.Items.Last()).Tag = orderItem.SalesOrderID; var productQuery = from orderDetail in db.SalesOrderDetail join product in db.Product on orderDetail.ProductID equals product.ProductID where orderDetail.SalesOrderID == orderItem.SalesOrderID select new { product.Name }; foreach (var productItem in productQuery) { ((RibbonMenu)menu1.Items.Last()).Items.Add (new RibbonCheckBox()); ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()). Items.Last()).Label = productItem.Name; ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()). Items.Last()).Click += new EventHandler<RibbonControlEventArgs>(checkBox_Click); } } }En el Explorador de soluciones, haga doble clic en el archivo de código de la cinta de opciones.
Se abre el Diseñador de la cinta de opciones.
En el Diseñador de la cinta de opciones, haga doble clic en el cuadro combinado Clientes.
El archivo de código de la cinta de opciones se abre en el editor de código y aparece el controlador de eventos ComboBox1_TextChanged.
Reemplace el controlador de evento ComboBox1_TextChanged con el código siguiente. Este código realiza las tareas siguientes:
Llama al método auxiliar PopulateSalesOrderInfo. Este método actualiza el menú Productos comprados con los pedidos relacionados con el cliente seleccionado.
Llama al método auxiliar PopulateMailItem. Este método rellena los campos Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject y Microsoft.Office.Interop.Outlook.MailItem.Body de los nuevos mensajes de correo.
Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles ComboBox1.TextChanged PopulateSalesOrderInfo() PopulateMailItem(ComboBox1.Text) End Subprivate void comboBox1_TextChanged(object sender, RibbonControlEventArgs e) { PopulateSalesOrderInfo(); PopulateMailItem(comboBox1.Text); }Agregue el código siguiente a la clase CustomerRibbon. Este código agrega el nombre de los productos seleccionados al campo Microsoft.Office.Interop.Outlook.MailItem.Body de los nuevos mensajes de correo.
Private Sub CheckBox_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Dim application As Outlook.Application = Globals.ThisAddIn.Application Dim inspector As Outlook.Inspector = application.ActiveInspector() Dim myMailItem As Outlook.MailItem = CType(inspector.CurrentItem, _ Outlook.MailItem) Dim myCheckBox As RibbonCheckBox = CType(sender, RibbonCheckBox) myMailItem.Subject = "Following up on your order" myMailItem.Body = myMailItem.Body + ControlChars.Lf + "* " _ + myCheckBox.Label End Subprivate void checkBox_Click(object sender, RibbonControlEventArgs e) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; RibbonCheckBox myCheckBox = (RibbonCheckBox)sender; myMailItem.Subject = "Following up on your order"; myMailItem.Body = myMailItem.Body + "\n" + "* " + myCheckBox.Label; }Agregue el código siguiente a la clase CustomerRibbon. Este código realiza las tareas siguientes:
Rellena la línea Microsoft.Office.Interop.Outlook.MailItem.To en los nuevos mensajes de correo con la dirección de correo electrónico del cliente actualmente seleccionado.
Agrega texto a los campos Microsoft.Office.Interop.Outlook.MailItem.Subject y Microsoft.Office.Interop.Outlook.MailItem.Body de los nuevos mensajes de correo.
Private Sub PopulateMailItem(ByVal addressToLine As String) Dim application As Outlook.Application = Globals.ThisAddIn.Application Dim inspector As Outlook.Inspector = application.ActiveInspector() Dim myMailItem As Outlook.MailItem = _ CType(inspector.CurrentItem, Outlook.MailItem) myMailItem.To = "" Dim tempArray As [String]() = addressToLine.Split(New [Char]() {"|"c}) myMailItem.To = tempArray(1) + "@example.com" myMailItem.Subject = "Following up on your order" myMailItem.Body = "Hello " + tempArray(1) + "," myMailItem.Body = myMailItem.Body + ControlChars.Lf + _ "We would like to get your " + _ "feedback on the following products that you recently ordered: " End Subprivate void PopulateMailItem(string addressToLine) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; myMailItem.To = ""; String[] tempArray = addressToLine.Split(new Char[] { '|' }); myMailItem.To = tempArray[1] + "@example.com"; myMailItem.Subject = "Following up on your order"; myMailItem.Body = "Hello " + tempArray[1] + ","; myMailItem.Body = myMailItem.Body + "\n" + "We would like to get your " + "feedback on the following products that you recently ordered: "; }
Probar los controles del grupo personalizado
Cuando abra un nuevo formulario de correo en Outlook, aparecerá el grupo personalizado Compras del cliente en la ficha Mensajes de la cinta de opciones.
Para crear un mensaje de correo electrónico de seguimiento, seleccione un cliente y, a continuación, seleccione los productos comprados por ese cliente. Los controles del grupo Compras del cliente se actualizan en tiempo de ejecución con los datos de la base de datos AdventureWorks.
Para probar los controles del grupo personalizado
Presione F5 para ejecutar el proyecto.
Se inicia Outlook.
En Outlook, en el menú Archivo, seleccione Nuevo y, a continuación, haga clic en Mensaje de correo.
Se producen las siguientes acciones:
Aparece una nueva ventana de inspector para el mensaje de correo.
En la ficha Mensajes de la cinta de opciones, el grupo Compras del cliente aparece delante del grupo Portapapeles.
El cuadro combinado Clientes del grupo se actualiza con los nombres de los clientes en la base de datos AdventureWorks.
En la ficha Mensajes de la cinta de opciones, en el grupo Compras del cliente, seleccione un cliente en el cuadro combinado Clientes.
Se producen las siguientes acciones:
El menú Productos comprados se actualiza con un menú que representa cada pedido de ese cliente.
Cada menú de pedido se actualiza con las casillas que representan los productos comprados por el cliente.
La dirección de correo electrónico del cliente seleccionado se agrega a la línea Para del mensaje de correo, y el asunto y el cuerpo del mensaje de correo se rellenan con texto.
Haga clic en el menú Productos comprados, elija cualquier pedido y, a continuación, haga clic en un producto del pedido.
El nombre del producto se agrega al cuerpo del mensaje de correo.
Pasos siguientes
Puede aprender más acerca de la personalización de la interfaz de usuario de Office en estos temas:
Agregar una interfaz de usuario basada en contexto a cualquier personalización de nivel de documento. Para obtener más información, vea Información general sobre paneles de acciones.
Extender un formulario estándar o personalizado de Microsoft Office Outlook. Para obtener más información, vea Tutorial: Diseñar un área de formulario de Outlook.
Agregar un panel de tareas personalizado a Outlook. Para obtener más información, vea Información general sobre los paneles de tareas personalizados.
Vea también
Tareas
Cómo: Iniciarse en la personalización de la cinta de opciones
Tutorial: Crear una ficha personalizada usando el diseñador de la cinta de opciones
Cómo: Cambiar el orden de las fichas en la cinta de opciones
Cómo: Personalizar una ficha integrada
Cómo: Personalizar el menú de Microsoft Office
Cómo: Mostrar errores de la interfaz de usuario
Conceptos
Acceso a la cinta de opciones en tiempo de ejecución
Información general sobre la cinta de opciones
diseñador de la cinta de opciones
Información general sobre el modelo de objetos para la cinta de opciones
Nota: