Как я могу отфильтровать DatGrid, который использует коллекцию Outlook COMobjects в качестве ItemsSource? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть таблица данных WPF с ItemSource в качестве пользователя, выбранного Outlook.Folder. Значения столбцов DataGrid связаны со свойствами границы Outlook.Folder.Items. В нем также есть текстовые поля, используемые для фильтрации соответствующих полей.

Чтобы отфильтровать данные, которые я создал, ICollectionView, а затем, используя событие TextChanged объекта TextBox, сравните свойство FullName со значением TextBox.Text ...

` ICollectionView FilterView = CollectionViewSource.GetDefaultView(KontaktGrid.Items);`

`FilterView.Filter = o =>
      {
        Outlook.ContactItem contact = o as Outlook.ContactItem;
        if (contact.CompanyName.ToUpper().Contains(filterBox.Text.ToUpper()))
            return true;
         return false;
      };`

Это работало нормально на моей небольшой выборке контактов, проблема возникает с большими числами, вот сообщение об ошибке ....

Количество элементов возможность одновременного открытия ограничена администратором сервера.

Поэтому я попытался включить Marshal.ReleaseComObject() в ложное условие для моего if()

`else{
      Marshal.ReleaseComObject(contact/o);
      return false;
      }`

увы. ..

COM-объект, который был отделен от базового RCW, не может быть использован.

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

Наконец, я попытался получить значение содержимого ячейки для сравнения, что, в свою очередь, я бы предпочел из-за длительного времени чтения для доступа к каждому объекту. Использование

`DataGridRow row = DataGrid.ItemContainerGenerator.ContainerFromItem(contact/o) 
KontaktGrid.Columns[column].GetCellContent(row);`

в качестве аргументов как o, так и его приведенного аналога.

Это работает в другой части моего кода, получая CheckBox, который я использую как часть того же DataGrid, чтобы показать независимо от того, выбран элемент или нет. В проблемном случае до сих пор возвращалось только ноль

Я в тупике.

1 Ответ

0 голосов
/ 08 марта 2020

Никогда не проходите через все элементы в папке. Вы бы не запустили запрос SQL без предложения WHERE?

Для запросов всегда используйте Items.Find / FindNext или Items.Restrict, Чтобы получить несколько элементов, не открывая их все (опять же, не делайте этого для всех элементов в папке), используйте MAPIFolder.GetTable(): https://docs.microsoft.com/en-us/office/vba/api/Outlook.Folder.GetTable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...