【问题标题】:Why does the DevExpress Treelist throw a HideException regularly?为什么 DevExpress Treelist 会定期抛出 HideException?
【发布时间】:2011-05-06 18:15:33
【问题描述】:

我一直在使用 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,它有什么好处?

【问题讨论】:

    标签: c# .net winforms exception-handling devexpress


    【解决方案1】:

    这是一种清理控件环境的程序流机制。尽管与普通代码相比,异常确实是昂贵的(原型示例是在将字符串转换为整数的循环中使用 FormatExceptions - 因此需要 TryParse 类型方法),但与 UI 中的主要更改相比,从数据库等,它们非常便宜且易于维护。

    您引用的演示代码正是这种情况:控件即将刷新其全部内容。最终用户单击了特定图标以执行特定操作——异常并非“总是”被抛出。我对这个示例代码的唯一不满(我强调它是示例代码)是该操作是在鼠标按下而不是在鼠标向上时完成的。

    我猜这个论点是“异常可以用于这种宏程序流,还是我们应该制定一个硬性规定,它们只能用于错误报告?”但这是另一个问题。

    更新

    WinForms 团队告诉我:

    HideException 是我们用于阻止默认鼠标事件处理的内部异常。我们同意这是一种停止代码执行的老式方法,特别是考虑到我们已经拥有DXMouseEventArgs 并能够设置e.Handled = true。不幸的是,XtraTreeList 目前不完全支持DXMouseEventArgs。我们将在下一个次要版本中添加此功能并相应地更新 E2474 示例。

    所以在一个月左右的时间里,它就会引起考古学的兴趣。

    【讨论】:

    • 示例代码是由 DevExpress 开发人员提交的吗?如果是这样,就让他们知道他们没有通过互联网代码审查(笑)。总而言之,您的支持和产品给我留下了深刻的印象,让您(DevExpress 团队)经常光顾 Stack Overflow 让我感觉 +1 真棒。
    • 我相信它是由 DevExpress 团队提交的。我很想听听他们为什么这样编写示例的推理。 @boyetboy 我最初的问题包括获取代码的链接,在那里你会看到在 OnMouseUp() 和 OnMouseDown() 中执行的操作。
    • WinForms 团队告诉我:“HideException 是我们的内部异常,用于阻止默认鼠标事件处理。我们同意这是停止代码执行的老式方法,特别是考虑到我们已经拥有能够设置 e.Handled = true 的 DXMouseEventArgs。不幸的是,XtraTreeList 目前不完全支持 DXMouseEventArgs。我们将在下一个次要版本中添加此功能并相应地更新 E2474 示例。所以在一个月左右的时间里,它会引起考古学的兴趣......
    • 我将您的评论添加到您的答案中,以便它具有一些永久性,希望您不要介意。
    【解决方案2】:

    我会说是

    1. 一个错误
    2. 用于以调用 Response.Redirect 将引发 ThreadAbort 异常以停止所有代码执行的方式发出消息信号。

    【讨论】:

      【解决方案3】:

      在我看来他们正在使用异常来控制程序流程。文档中的一些注释指出它会阻止调用基类方法。这太可怕了。无例外地执行此操作的 .NET 框架方法是 OnMouseWheel() 使用的 HandledMouseEventArgs 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-22
        • 2015-02-10
        • 2015-10-11
        • 1970-01-01
        • 2021-12-20
        • 2021-03-05
        • 2021-03-19
        • 2023-03-14
        相关资源
        最近更新 更多