Frage

Wir entwickeln Outlook 2007-Add-in. Zum Testen Aussichten Kategorie Umbenennung habe ich den folgenden Codeblock

hinzugefügt
 var session = Application.Session;
 var categories = session.Categories;
 var category1 = session.Categories[1];

 //catefory1.Name is "Group1" before executing line below
 category1.Name = "TEST!!!";

 Marshal.ReleaseComObject(category1);
 Marshal.ReleaseComObject(categories);
 Marshal.ReleaseComObject(session);

bis zum Ende der Add-in private void ThisAddIn_Startup(object sender, EventArgs e) Verfahren. Die Kategorie wird umbenannt, aber wenn Outlook geschlossen ist, werden die obigen Zeilen kommentiert, und Ausblick wieder gestartet - der Kategoriename ist nicht „TEST !!!“ wie ich erwartet habe. Es ist „Gruppe1“, wie er ist, bevor die Umbenennung war. Ist es möglich, Aussichten Kategorie „für immer“ von Code umbenennen? Microsoft.Office.Interop.Outlook.Category hat keine Save () oder Update () oder Persist () Methoden.

P. S. Wir entwickeln Outlook 2007 Add-in Visual Studio 2008, .NET 3.5, C # 3. Das Problem wird mit Outlook 2007 SP1 und SP2 wiedergegeben. Weitere Outlook-Versionen wurden nicht getestet.

War es hilfreich?

Lösung

Ich habe das Problem (das Problem selbst Outlook 2007 Fehler zu sein scheint) gelöst mit einem Hack. Die folgenden Links haben mir geholfen, den Hack zu erstellen (oops, nicht genug Ruf mehr als 1 Link zu posten):

Der Hack selbst ist unten zeigen:

using System;
using System.Text;
using System.Xml;
using System.IO;
using Microsoft.Office.Interop.Outlook;

namespace OutlookHack
{
    public static class OutlookCategoryHelper
    {
        private const string CategoryListStorageItemIdentifier = "IPM.Configuration.CategoryList";
        private const string CategoryListPropertySchemaName = @"http://schemas.microsoft.com/mapi/proptag/0x7C080102";
        private const string CategoriesXmlElementNamespace = "CategoryList.xsd";
        private const string XmlNamespaceAttribute = "xmlns";
        private const string CategoryElement = "category";
        private const string NameAttribute = "name";

        public static void RenameCategory(string oldName, string newName, Application outlookApplication)
        {
            MAPIFolder calendarFolder = outlookApplication.Session.GetDefaultFolder(
                OlDefaultFolders.olFolderCalendar);
            StorageItem categoryListStorageItem = calendarFolder.GetStorage(
                CategoryListStorageItemIdentifier, OlStorageIdentifierType.olIdentifyByMessageClass);

            if (categoryListStorageItem != null)
            {
                PropertyAccessor categoryListPropertyAccessor = categoryListStorageItem.PropertyAccessor;
                string schemaName = CategoryListPropertySchemaName;
                try
                {
                    // next statement raises Out of Memory error if property is too big
                    var xmlBytes = (byte[])categoryListPropertyAccessor.GetProperty(schemaName);

                    // the byte array has to be translated into a string and then the XML has to be parsed
                    var xmlReader = XmlReader.Create(new StringReader(Encoding.UTF8.GetString(xmlBytes)));

                    // xmlWriter will write new category list xml with renamed category
                    XmlWriterSettings settings = new XmlWriterSettings { Indent = true, IndentChars = ("\t") };
                    var stringWriter = new StringWriter();
                    var xmlWriter = XmlWriter.Create(stringWriter, settings);

                    xmlReader.Read(); // read xml declaration
                    xmlWriter.WriteNode(xmlReader, true);
                    xmlReader.Read(); // read categories
                    xmlWriter.WriteStartElement(xmlReader.Name, CategoriesXmlElementNamespace);
                    while (xmlReader.MoveToNextAttribute())
                    {
                        if (xmlReader.Name != XmlNamespaceAttribute) // skip namespace attr
                        {
                            xmlWriter.WriteAttributeString(xmlReader.Name, xmlReader.Value);
                        }
                    }
                    while (xmlReader.Read())
                    {
                        switch (xmlReader.NodeType)
                        {
                            case XmlNodeType.Element: // read category
                                xmlWriter.WriteStartElement(CategoryElement);
                                while (xmlReader.MoveToNextAttribute())
                                {
                                    if ((xmlReader.Name == NameAttribute) && (xmlReader.Value == oldName))
                                    {
                                        xmlWriter.WriteAttributeString(NameAttribute, newName);
                                    }
                                    else
                                    {
                                        xmlWriter.WriteAttributeString(xmlReader.Name, xmlReader.Value);
                                    }
                                }
                                xmlWriter.WriteEndElement();
                                break;
                            case XmlNodeType.EndElement: // categories ended
                                xmlWriter.WriteEndElement();
                                break;
                        }
                    }
                    xmlReader.Close();
                    xmlWriter.Close();

                    xmlBytes = Encoding.UTF8.GetBytes(stringWriter.ToString());
                    categoryListPropertyAccessor.SetProperty(schemaName, xmlBytes);
                    categoryListStorageItem.Save();
                }
                catch (OutOfMemoryException)
                {
                    // if error is "out of memory error" then the XML blob was too big
                }
            }
        }
    }
}

Diese Hilfsmethode vor aufgerufen Kategorie Umbenennung werden müssen, z.

 var session = Application.Session;
 var categories = session.Categories;
 var category1 = session.Categories[1];

 //catefory1.Name is "Group1" before executing line below
 OutlookCategoryHelper.RenameCategory(category1.Name, "TEST!!!", Application);
 category1.Name = "TEST!!!";

 Marshal.ReleaseComObject(category1);
 Marshal.ReleaseComObject(categories);
 Marshal.ReleaseComObject(session);

Andere Tipps

Dies ist ein Outlook-Fehler mit Outlook 2007 SP2 führen.

"Betrachten Sie das folgende Szenario vor. Sie haben eine benutzerdefinierte Anwendung, die ausgeführt werden kann, neue Kategorien in Outlook 2007 zu erstellen. Sie führen die Anwendung 2007. Dann eine neue Kategorie in Outlook erstellen, wenn Sie Outlook 2007 neu starten, die Kategorie, die Sie unerwartet entfernt erstellt wird. Dieses Problem tritt auf, nachdem Sie das Februarycumulative aktualisieren oder SP2 installieren. "

Es ist ein Hotfix verfügbar seit dem 30. Juni 2009: http://support.microsoft.com/default.aspx/kb/970944/ en

Viele Grüße, Tim

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top