Oulook 2010 - Categories.Add()不一致 [英] Oulook 2010 - Categories.Add() inconsitencies

查看:98
本文介绍了Oulook 2010 - Categories.Add()不一致的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我试图通过加载项以编程方式在Outlook 2010中添加多个类别。

I am trying to programmatically add multiple Categories in Outlook 2010 via an add-in.

添加-in从调度系统中退出预订列表,然后编译一个不同的预订类型列表(使用颜色 - 有效的OlCategoryColor枚举值),然后检查该类别是否存在。  如果它存在,它会检查
颜色匹配,如果id没有,则它会更新现有Category的颜色。  如果类别不存在则会创建一个新类别。

The add-in retireves a list of bookings from a scheduling system and then compiles a distinct list of Booking Types (with colours - valid OlCategoryColor enum values) and then checks to see if the category exists or not.  If it exists it checks the colour matches and if id doesn' then it updates the existing Category's colour.  If the Category doesn't exist then a new one is created.

我的问题是Categories.Add()似乎并不总是有效。  我之后有TraceInformation确认代码已被命中但我必须多次运行以确保所有类别都已正确创建。

My issue is that Categories.Add() doesn't seem to always work.  I have TraceInformation just after to confirm that the code has been hit but I have to run many times to ensure all the Categories are correctly created.

任何想法?

        private class ExtBookingType
        {
            public ExtBookingType(string name, string colour)
            {
                Name = name;
                Colour = colour;
            }

            public string Name { get; private set; }
            public string Colour { get; set; }
        }

        private List<ExtBookingType> _bookingTypesCache;

        public void SyncBookings(BookingsSyncArgs bookings)
        {
            var application = new Application();
            _Categories categories = application.Session.Categories;

            if (_bookingTypesCache == null)
            {
                CacheCategories(categories);
            }
            Debug.WriteLine(string.Format("Categories cached/checked at {0}", DateTime.Now.ToString("HH:mm:ss on d MMM yyyy")));

            var bookingsTypes =
                bookingCalendarItems.Select(
                    wc => new { BookingName = wc.BookingTypeName, Background = wc.BackgroundColour }).Distinct();

            foreach (var bookingsType in bookingsTypes)
            {
                var outlookFriendlyBookingName = CreateOutlookFriendlyBookingName(bookingsType.BookingName);
                categories = application.Session.Categories;

                if (CategoryExists(outlookFriendlyBookingName))
                {
                    if (!CategoryColourMatches(outlookFriendlyBookingName, bookingsType.Background))
                        UpdateCategory(categories, outlookFriendlyBookingName, bookingsType.Background);
                }
                else
                    AddACategory(categories, outlookFriendlyBookingName, bookingsType.Background);
            }

        //... cut out as irrelevant
        }

        private string CreateOutlookFriendlyBookingName(string bookingTypeName)
        {
            return String.Format("{0} (WC booking)", bookingTypeName);
        }

        private void UpdateCategory(_Categories categories, string outlookFriendlyBookingName, string colour)
        {
            var categoryColour = (OlCategoryColor)Enum.Parse(typeof(OlCategoryColor), colour);

            foreach (var category in categories.Cast<Category>().Where(category => category.Name == outlookFriendlyBookingName))
            {
                category.Color = categoryColour;
            }
            var bookingType = _bookingTypesCache.FirstOrDefault(bt => bt.Name == outlookFriendlyBookingName);
            if (bookingType != null)
                bookingType.Colour = colour;
        }

        private void CacheCategories(_Categories categories)
        {
            if (_bookingTypesCache == null)
                _bookingTypesCache = new List<ExtBookingType>();
            else
                _bookingTypesCache.Clear();

            foreach (Category category in categories)
            {
                _bookingTypesCache.Add(new ExtBookingType(category.Name, category.Color.ToString()));
            }
        }

        private void AddACategory(_Categories categories, string categoryName, string colour)
        {
            var categoryColour = (OlCategoryColor)Enum.Parse(typeof(OlCategoryColor), colour);
            categories.Add(categoryName, categoryColour);
            Trace.TraceInformation(string.Format("Added Category: {0}", categoryName));
            var tempWCBooking = new ExtBookingType(categoryName, colour);
            _bookingTypesCache.Add(tempWCBooking);

            if (categories[categoryName] == null)
                _bookingTypesCache.Remove(tempWCBooking);
        }

        private bool CategoryExists(string categoryName)
        {
            return _bookingTypesCache.Exists(bt => bt.Name == categoryName);
        }

        private bool CategoryColourMatches(string categoryName, string colour)
        {
            return _bookingTypesCache.Exists(bt => bt.Name == categoryName && bt.Colour == colour);
        }

推荐答案

嗨Drammy,

Hi Drammy,

感谢您在MSDN论坛上发帖。

Thanks for posting in the MSDN Forum.

请告诉我您的代码在哪里使用?是否在加载项中使用?

Would you please tell me where your code has been used? Does it be used in a add-in?

祝你有个美好的一天,

Tom


这篇关于Oulook 2010 - Categories.Add()不一致的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆