Procédure pas à pas : mise à niveau des contrôles sur un ruban au moment de l'exécution
Mise à jour : novembre 2007
S'applique à |
---|
Les informations de cette rubrique s'appliquent uniquement aux projets Visual Studio Tools pour Office et versions de Microsoft Office spécifiés. Type de projet
Version de Microsoft Office
Pour plus d'informations, consultez Fonctionnalités disponibles par type d'application et de projet. |
Cette procédure pas à pas montre comment utiliser le modèle objet de ruban pour mettre à jour les contrôles sur un ruban après le chargement du ruban dans l'application Office.
L'exemple extrait des données de l'exemple de base de données AdventureWorks pour remplir une zone de liste déroulante et un menu dans Microsoft Office Outlook.
Cette procédure pas à pas décrit les tâches suivantes :
Création d'un projet de complément Outlook.
Conception d'un groupe de ruban personnalisé.
Ajout du groupe personnalisé à un onglet intégré.
Mise à jour des contrôles sur le ruban au moment de l'exécution.
Remarque : |
---|
Il se peut que votre ordinateur affiche des noms ou des emplacements différents pour certains éléments de l'interface utilisateur de Visual Studio mentionnés dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, consultez Paramètres Visual Studio. |
Composants requis
Pour exécuter cette procédure pas à pas, vous devez disposer des composants suivants :
Visual Studio Tools pour Office (un composant facultatif de Visual Studio 2008 Professional et Visual Studio Team System).
Microsoft Office Outlook 2007
Accédez à l'exemple de base de données AdventureWorks pour SQL Server Express. Pour plus d'informations sur l'installation de la base de données AdventureWorks, consultez Procédure pas à pas : installation de la base de données AdventureWorks.
Visual Studio Tools pour Office est installé par défaut avec les versions répertoriées de Visual Studio. Pour vérifier s'il est installé, consultez Installation de Visual Studio Tools pour Office.
Création d'un projet de complément Outlook
Commencez par créer un projet de complément Outlook.
Pour créer un projet de complément Outlook
Dans Visual Studio, créez un projet de complément Outlook 2007 et nommez-le MyOutlookAddIn.
Dans la boîte de dialogue Nouveau projet, sélectionnez Créer le répertoire pour la solution.
Enregistrez le projet dans le répertoire de projet par défaut.
Pour plus d'informations, consultez Comment : créer des projets Visual Studio Tools pour Office.
Conception d'un groupe de ruban personnalisé
Le ruban n'apparaît pas dans la zone d'interface principale d'Outlook. Pour cet exemple, il apparaîtra donc lorsqu'un utilisateur compose un nouveau message électronique. Pour créer un groupe personnalisé pour le ruban, commencez par ajouter un élément Ruban à votre projet, puis concevez le groupe dans le Concepteur de ruban. Ce groupe personnalisé vous permet d'extraire d'une base de données les noms et les historiques de commande des clients pour créer des messages électronique de suivi.
Pour concevoir un groupe personnalisé
Dans le menu Projet, cliquez sur Ajouter un nouvel élément.
Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Ruban (Concepteur visuel).
Remplacez le nom du nouveau ruban par CustomerRibbon, puis cliquez sur Ajouter.
Le fichier CustomerRibbon.cs ou CustomerRibbon.vb s'ouvre dans le Concepteur de ruban et affiche un onglet et un groupe par défaut.
Cliquez sur le Concepteur de ruban pour le sélectionner.
Dans le menu Affichage, cliquez sur Fenêtre Propriétés.
Dans la fenêtre Propriétés, cliquez sur la flèche de déroulement en regard de la propriété RibbonType, puis sur Microsoft.Outlook.Mail.Compose.
Le ruban apparaîtra lorsque l'utilisateur composera un nouveau message électronique dans Outlook.
Dans le Concepteur de ruban, cliquez sur Group1 pour le sélectionner.
Dans la fenêtre Propriétés, affectez la valeur Customer Purchases à Étiquette.
Dans l'onglet Contrôles de ruban Office de la Boîte à outils, faites glisser une zone de liste déroulante sur le groupe Customer Purchases.
Cliquez sur ComboBox1 pour le sélectionner.
Dans la fenêtre Propriétés, affectez la valeur Customers à Étiquette.
Dans l'onglet Contrôles de ruban Office de la Boîte à outils, faites glisser un menu sur le groupe Customer Purchases.
Dans la fenêtre Propriétés, affectez la valeur Product Purchased à Étiquette.
Affectez la valeur true à Dynamique.
Vous pouvez maintenant ajouter des contrôles sur le menu et en supprimer au moment de l'exécution, après le chargement du ruban dans l'application Office.
Ajout du groupe personnalisé à un onglet intégré
Un onglet intégré est un onglet qui se trouve déjà sur le ruban d'un inspecteur Outlook. Au cours de cette procédure, vous allez ajouter le groupe personnalisé à un onglet intégré, puis spécifier la position du groupe sur l'onglet.
Pour ajouter le groupe personnalisé à un onglet intégré
Cliquez sur l'onglet TabAddins (Built-In) pour le sélectionner.
Dans la fenêtre Propriétés, développez la propriété ControlId, puis affectez la valeur TabNewMailMessage à OfficeId.
Le groupe Customer Purchases est alors ajouté à l'onglet Messages du ruban qui apparaît dans un nouveau message électronique.
Cliquez sur le groupe Customer Purchases pour le sélectionner.
Dans la fenêtre Propriétés, développez la propriété Position, cliquez sur la flèche de déroulement en regard de la propriété PositionType, puis cliquez sur BeforeOfficeId.
Affectez la valeur GroupClipBoard à la propriété OfficeId.
Le groupe Customer Purchases est alors placé avant le groupe Presse-papiers de l'onglet Messages.
Mise à jour de contrôles dans le groupe personnalisé au moment de l'exécution
Utilisez le modèle objet de ruban pour effectuer les tâches suivantes :
Ajouter des noms de client à la zone de liste déroulante Customers.
Ajouter des contrôles de menu et de case à cocher au menu Products Purchased qui représente les commandes et les produits vendus.
Remplir les champs Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject et Microsoft.Office.Interop.Outlook.MailItem.Body de nouveaux messages électronique avec des données de la zone de liste déroulante Customers et du menu Products Purchased.
Pour mettre à jour des contrôles dans le groupe personnalisé en utilisant le modèle objet de ruban
Dans le menu Projet, cliquez sur Ajouter une référence.
Dans la boîte de dialogue Ajouter une référence, cliquez sur l'onglet .NET, sélectionnez l'assembly System.Data.Linq, puis cliquez sur OK.
Cet assembly contient des classes pour l'utilisation de requêtes LINQ (Language-Integrated Queries). Vous utiliserez LINQ pour remplir des contrôles du groupe personnalisé avec des données de la base de données AdventureWorks. Pour plus d'informations sur LINQ, consultez LINQ (Language-Integrated Query).
Dans l'Explorateur de solutions, cliquez sur CustomerRibbon.cs ou CustomerRibbon.vb pour le sélectionner.
Dans le menu Affichage, cliquez sur Code.
Le fichier de code du ruban s'ouvre dans l'éditeur de code.
Ajoutez les instructions suivantes au début du fichier de code du ruban. Ces instructions facilitent l'accès aux espaces de noms LINQ et à l'espace de noms de l'assembly PIA (Primary Interop Assembly) d'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.Outlook
using System.Data.Linq; using System.Linq; using System.Data.Linq.Mapping; using System.Linq.Expressions; using Outlook = Microsoft.Office.Interop.Outlook; using System.IO;
Ajoutez les classes suivantes au fichier de code du ruban. Vous utiliserez ces classes pour stocker des informations issues des tables Customer, Contact, Sales Order Header, Sales Order Detail et Product de la base de données 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) { } }
Remplacez la méthode de gestionnaire d'événements CustomerRibbon_Load par le code suivant. Ce code utilise une requête LINQ pour effectuer les tâches suivantes :
Remplir la zone de liste déroulante Customers avec l'ID et le nom de 20 clients de la base de données AdventureWorks.
Appelle la méthode d'assistance PopulateSalesOrderInfo. Cette méthode met à jour le menu ProductsPurchased avec les numéros de commande relatifs au client sélectionné.
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 Sub
private 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(); }
Ajoutez le code suivant à la classe CustomerRibbon. Ce code utilise des requêtes LINQ pour effectuer les tâches suivantes :
Ajoute un sous-menu au menu ProductsPurchased pour chaque commande relative au client sélectionné.
Ajoute des cases à cocher à chaque sous-menu pour les produits relatifs à la commande.
Ajoute des gestionnaires d'événements à chaque case à cocher.
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 Sub
private 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); } } }
Dans l'Explorateur de solutions, double-cliquez sur le fichier de code du ruban.
Le Concepteur de ruban s'ouvre.
Dans le Concepteur de ruban, double-cliquez sur la zone de liste déroulante Customers.
Le fichier de code du ruban s'ouvre dans l'éditeur de code et le gestionnaire d'événements ComboBox1_TextChanged s'affiche.
Remplacez le gestionnaire d'événements ComboBox1_TextChanged par le code suivant. Ce code exécute les tâches suivantes :
Appelle la méthode d'assistance PopulateSalesOrderInfo. Cette méthode met à jour le menu Products Purchased avec les commandes relatives au client sélectionné.
Appelle la méthode d'assistance PopulateMailItem. Cette méthode renseigne les champs Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject et Microsoft.Office.Interop.Outlook.MailItem.Body de nouveaux messages électroniques.
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 Sub
private void comboBox1_TextChanged(object sender, RibbonControlEventArgs e) { PopulateSalesOrderInfo(); PopulateMailItem(comboBox1.Text); }
Ajoutez le code suivant à la classe CustomerRibbon. Ce code ajoute le nom des produits sélectionnés au champ Microsoft.Office.Interop.Outlook.MailItem.Body de nouveaux messages électroniques.
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 Sub
private 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; }
Ajoutez le code suivant à la classe CustomerRibbon. Ce code exécute les tâches suivantes :
Renseigne la ligne Microsoft.Office.Interop.Outlook.MailItem.To de nouveaux messages électroniques avec l'adresse électronique du client sélectionné.
Ajoute du texte aux champs Microsoft.Office.Interop.Outlook.MailItem.Subject et Microsoft.Office.Interop.Outlook.MailItem.Body de nouveaux messages électroniques.
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 Sub
private 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: "; }
Test des contrôles dans le groupe personnalisé
Lorsque vous ouvrez un nouveau formulaire de courrier dans Outlook, un groupe personnalisé nommé Customer Purchases apparaît sur l'onglet Messages du ruban.
Pour créer un message électronique de suivi client, sélectionnez un client, puis des produits achetés par ce client. Les contrôles du groupe Customer Purchases sont mis à jour au moment de l'exécution avec les données de la base de données AdventureWorks.
Pour tester les contrôles dans le groupe personnalisé
Appuyez sur F5 pour exécuter votre projet.
Outlook démarre.
Dans le menu Fichier d'Outlook, pointez sur Nouveau, puis cliquez sur Message.
Les actions suivantes ont lieu :
Une nouvelle fenêtre de l'inspecteur de message électronique apparaît.
Sur l'onglet Messages du ruban, le groupe Customer Purchases apparaît avant le groupe Presse-papiers.
La zone de liste déroulante Customer Purchases du groupe est mise à jour avec les noms de clients de la base de données AdventureWorks.
Sur l'onglet Messages du ruban, dans le groupe Customer Purchases, sélectionnez un client de la zone de liste déroulante Customers.
Les actions suivantes ont lieu :
Le menu Products Purchased est mis à jour avec un menu qui représente chaque commande de ce client.
Chaque menu de commande client est mis à jour avec des cases à cocher qui représentent les produits achetés par le client.
L'adresse électronique du client sélectionné est ajoutée à la ligne À du message électronique et l'objet et le corps du message sont remplis avec du texte.
Cliquez sur le menu Products Purchases, pointez sur une commande, puis cliquez sur un produit de la commande.
Le nom du produit est ajouté au corps du message électronique.
Étapes suivantes
Pour plus d'informations sur la personnalisation de l'interface utilisateur d'Office, consultez les rubriques suivantes :
Ajouter une interface utilisateur contextuelle à une personnalisation au niveau du document. Pour plus d'informations, consultez Vue d'ensemble du volet Actions.
Étendre un formulaire Microsoft Office standard ou personnalisé. Pour plus d'informations, consultez Procédure pas à pas : conception d'une zone de formulaire Outlook.
Ajouter un volet de tâches personnalisé à Outlook. Pour plus d'informations, consultez Vue d'ensemble des volets de tâches personnalisés.
Voir aussi
Tâches
Comment : démarrer avec la personnalisation du ruban
Procédure pas à pas : création d'un onglet personnalisé à l'aide du Concepteur de ruban
Comment : modifier l'ordre des onglets sur le ruban
Comment : personnaliser un onglet intégré
Comment : personnaliser le menu Microsoft Office
Comment : exporter un ruban à partir du Concepteur de ruban vers l'élément XML Ribbon
Comment : afficher les erreurs de l'interface utilisateur du complément
Concepts
Accès au ruban au moment de l'exécution