Фатальная ошибка при переключении активного листа из палитры

Автор Тема: Фатальная ошибка при переключении активного листа из палитры  (Прочитано 5690 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В продолжение этой темы.
Имеется менеджер листов, оформленный в палитре.

В палитре используется ListView.
Для биндинга листов используется специальный класс:
Код - C# [Выбрать]
  1. static ObservableCollection<LayoutForBinding> _currentDocLayouts;
  2.  
  3. private class LayoutForBinding
  4. {
  5.     public string LayoutName { get; set; }
  6.     public bool ModelType { get; set; }
  7.     public int TabOrder { get; set; }
  8.     public bool TabSelected { get; set; }
  9. }
Получение листов и их привязка происходят так:
Извините, вам запрещён просмотр содержимого спойлеров.

При двойном клике мышкой в списке листов происходит переключение на лист:
Код - C# [Выбрать]
  1. // open by double click
  2. private void LayoutItem_DoubleClick(object sender, MouseButtonEventArgs e)
  3. {
  4.     OpenSelectedLayout();
  5. }
  6. private void OpenSelectedLayout()
  7. {
  8.     var lm = LayoutManager.Current;
  9.     try
  10.     {
  11.         var doc = AcApp.DocumentManager.MdiActiveDocument;
  12.         if (LvLayouts.SelectedItems.Count > 1)
  13.         {
  14.             MpMsgWin.Show("Выберите, пожалуйста, один лист");
  15.             return;
  16.         }
  17.  
  18.         lm.LayoutSwitched -= Lm_LayoutSwitched;
  19.         var selectedLayout = LvLayouts.SelectedItem as LayoutForBinding;
  20.  
  21.         if (selectedLayout != null)
  22.         {
  23.             using (doc.LockDocument())
  24.             {
  25.                 lm.CurrentLayout = selectedLayout.LayoutName;
  26.                 doc.Editor.Regen();
  27.             }
  28.             BindingLayoutsToListView();
  29.         }
  30.     }
  31.     catch (Exception exception)
  32.     {
  33.         MpExWin.Show(exception);
  34.     }
  35.     finally
  36.     {
  37.         lm.LayoutSwitched += Lm_LayoutSwitched;
  38.     }
  39. }

Так вот - проблема: ИНОГДА при переключении листов происходит фатальная ошибка. Проблема в том, что вызвать проблему никак не получается. Происходит в разных файлах, на разных компьютерах и с разной периодичностью - за целый рабочий день может ни разу не произойти, а может несколько раз.
Пишу сюда, в надежде на светлые идеи что и как попробовать исправить/переделать, чтобы такого не происходило ))


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Пекшев aka Modis
Как обычно ошибка скорее всего не в показанном коде... :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как обычно ошибка скорее всего не в показанном коде...
Возможно Вы правы) Иногда создание темы на форуме подталкивает мозг начать думать сильнее
Есть одна идея по поводу того, почему так происходит:
В своем проекте использую "возможность", взятую отсюда - изменение позиции листа простым перетаскиванием его в списке. Я думал, что это взаимосвязано все-же. В итоге, после нескольких манипуляций в коде я заставил все-же фатальную ошибку появляться и на моем компьютере! После чего начал работать, запустив автокад в режиме отладки. И отловил все-таки ошибку, возникающую в стороннем коде. Так как сторонний код выше моих знаний - решил проблему "костылем" - в нужном методе добавил обертку в try{} catch{} с возвращением значения false.
Как мне видится причина ошибки - когда в коде вызывается ed.Regen(), то частично "зависает" GUI автокада, но мой код умудряется сработать и происходит конфликт. Вот прям сам момент я поймать не смог, но думаю, что проблема решится
В данный момент тестирую свои догадки