Невозможно привести объект типа «System.String» к типу «Microsoft.Office.Interop.Outlook.Store». - PullRequest
0 голосов
/ 22 марта 2019

Я разрабатываю надстройки для Outlook, которые заполняют все доступные общие почтовые ящики в поле со списком и отправляет электронную почту с использованием выбранного почтового ящика.

Когда я выбираю почтовую учетную запись из поля со списком, я получаю сообщение об ошибке

Невозможно привести объект типа 'System.String' к типу 'Microsoft.Office.Interop.Outlook.Store'

Ниже приведен код. Заполните поле со списком.

private void MailBoxOptions_Load(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Outlook.Application application =
        new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace ns = application.GetNamespace("MAPI");
    Stores stores = ns.Stores;
    foreach (var store in Globals.ThisAddIn.Application.Session.Stores
        .Cast<Microsoft.Office.Interop.Outlook.Store>()
        .Where(c => c.ExchangeStoreType == 
                      Microsoft.Office.Interop.Outlook.OlExchangeStoreType.olExchangeMailbox))
    {
        if (store != null)
        {
            mailBoxes.Items.Add(store.DisplayName);
        }
        else
        {
            MessageBox.Show("You don't have access to any shared mail-inbox.");
        }
    }
}

Код для поля со списком

public void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedStore = (Store)mailBoxes.SelectedItem;

}

Любая помощь будет оценена. Спасибо.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

С помощью mailBoxes.Items.Add(store.DisplayName); вы добавляете отображаемое имя магазина как string в ComboBox.И это именно то, что вы получаете взамен mailBoxes.SelectedItem.Конечно, вы не можете привести эту строку к Store.

. Вы можете поместить магазин в класс отображения

public class StoreDisplay
{
    public StoreDisplay(Store store)
    {
        this.Store = store;
    }

    public Store Store { get; }

    public override string ToString() ==> Store.DisplayName;
}

. Затем вы можете добавлять элементы в ComboBox с помощью

* 1011.*

Поскольку ToString был переопределен, ComboBox покажет DisplayName или каждый элемент магазина.

Наконец, вы можете восстановить магазин с помощью

var selectedStore = ((StoreDisplay)mailBoxes.SelectedItem)?.Store;
if (selectedStore != null) {
    ...
}

. Вы можететакже попробуйте добавить объекты Store непосредственно в ComboBox;однако я не знаю, будут ли они правильно отображаться.


Примечание: если у вас конфликтующие имена типов или вы просто хотите использовать более короткие ссылки на пространства имен, вы можете использовать псевдонимы пространства имен

using MsOl = Microsoft.Office.Interop.Outlook;
using AppSession = Globals.ThisAddIn.Application.Session;

и используйте его вот так

var application = new MsOl.Application();
MsOl.NameSpace ns = application.GetNamespace("MAPI");
Stores stores = ns.Stores;
foreach (var store in AppSession.Stores
    .Cast<MsOl.Store>()
    .Where(c => c.ExchangeStoreType == MsOl.OlExchangeStoreType.olExchangeMailbox))
{
    ...
}
0 голосов
/ 22 марта 2019

если вы можете получить доступ к Globals.ThisAddIn.Application.Session.Stores.Cast<Microsoft.Office.Interop.Outlook.Store>() .Where(c => c.ExchangeStoreType == Microsoft.Office.Interop.Outlook.OlExchangeStoreType.olExchangeMailbox) в comboBox1_SelectedIndexChanged,

, вы можете попробовать:

var selectedStore = Globals.ThisAddIn.Application.Session.Stores.Cast<Microsoft.Office.Interop.Outlook.Store>()
   .Where(c => c.ExchangeStoreType == Microsoft.Office.Interop.Outlook.OlExchangeStoreType.olExchangeMailbox)
   .SingleOrDefault(x => x.DisplayName == mailBoxes.SelectedItem);
0 голосов
/ 22 марта 2019

Полагаю, mailBoxes - это ваш ComboBox, тогда

mailBoxes.Items.Add(store.DisplayName);

Добавляет только строки DisplayName в ComboBox. Теперь ваша проблема - вернуть их обратно в почтовый ящик.
Если не может быть двух почтовых ящиков с одинаковым именем, я предлагаю Dictionary

private Dictionary<string, Store> storeDictionary = new Dictionary<string, Store>();

private void MailBoxOptions_Load(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace ns = application.GetNamespace("MAPI");
    Stores stores = ns.Stores;
    foreach (var store in Globals.ThisAddIn.Application.Session.Stores.Cast<Microsoft.Office.Interop.Outlook.Store>().Where(c => c.ExchangeStoreType == Microsoft.Office.Interop.Outlook.OlExchangeStoreType.olExchangeMailbox))
    {
        if (store != null)
        {
            mailBoxes.Items.Add(store.DisplayName);
            storeDictionary.Add(store.DisplayName, store); // Add the items to the dictionary
        }
        else
        {
            MessageBox.Show("You don't have access to any shared mail-inbox.");
        }
    }
}

Тогда получите Store из словаря

public void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if(!mailBoxes.SelectedItem is string selectedString))
        return;

    bool successful = storeDictionary.TryGetValue(selectedString, out Store selectedStore);
    if(!successful)
    {
        return;
    }
    // Access selectedStore here
}
...