Почему DevExpress Treelist регулярно создает исключение HideException? - PullRequest
4 голосов
/ 08 ноября 2010

Я работал с кодом DevExpress Filter TreeList и мне интересно, почему он выдает DevExpress.Utils.HideException.

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

С FilterTreeList.cs

private void OnMouseDown(object sender, MouseEventArgs e)
{
   if ( e.Button != MouseButtons.Left )
       return;

   TreeListHitInfo hitInfo = ((TreeList)sender).CalcHitInfo(e.Location);
   if ( hitInfo.HitInfoType == HitInfoType.Column )
   {
       ColumnInfo colInfo = ((TreeList)sender).ViewInfo.ColumnsInfo[hitInfo.Column];
       GridFilterButtonInfoArgs filterButtonInfo = GetFilterButtonInfoArgs(colInfo);

       if ( filterButtonInfo != null && filterButtonInfo.Bounds.Contains(e.Location) )
       {
           filterButtonInfo.State = ObjectState.Pressed;
               ((TreeList)sender).InvalidateColumnHeader(hitInfo.Column);

           throw new HideException();
       }
   }

Почему они бросают HideException здесь, и какую пользу это приносит?

Ответы [ 3 ]

7 голосов
/ 08 ноября 2010

Это механизм потока программ для очистки среды элемента управления.Хотя это правда, что исключения являются дорогостоящими по сравнению с обычным кодом (архетипический пример использует FormatExceptions в цикле, который преобразует строки в целочисленные значения - следовательно, необходимы методы типа TryParse), по сравнению с основными изменениями в пользовательском интерфейсе, выборка данных избаза данных и т. д. они очень дешевы и просты в обслуживании.

Демонстрационный код, который вы цитируете, является именно таким сценарием: элемент управления собирается обновить все содержимое.Конечный пользователь нажал на конкретный значок, чтобы выполнить определенное действие - исключение не «выдается» вообще.Моя единственная претензия к этому примеру кода (и я подчеркиваю, что это пример кода) заключается в том, что действие выполняется при нажатии мыши, а не при нажатии мыши вверх.

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

Обновление

Команда WinForms сообщает мне:

HideException - это наше внутреннее исключение, которое используется для предотвращения дефолтаобработка событий мыши.Мы согласны, что это старомодный способ остановить выполнение кода, особенно учитывая, что у нас уже есть DXMouseEventArgs с возможностью установить e.Handled = true.К сожалению, XtraTreeList в настоящее время не полностью поддерживает DXMouseEventArgs.Мы добавим эту функциональность в следующей минорной версии и обновим пример E2474 соответственно.

Так что это будет представлять археологический интерес через месяц или около того.

1 голос
/ 08 ноября 2010

Похоже, они используют исключения для управления потоком программ. Некоторые заметки в документации, что он предотвращает вызов метода базового класса. Это довольно ужасно. .NET Framework способ сделать это без исключения является класс HandledMouseEventArgs, используемый OnMouseWheel ().

1 голос
/ 08 ноября 2010

Я бы сказал, что это

  1. Ошибка
  2. Используется для сообщения о том, что вызывающий Response.Redirect вызовет исключение ThreadAbort для остановки выполнения всего кода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...