为啥 DevExpress Treelist 会定期抛出 HideException?
Posted
技术标签:
【中文标题】为啥 DevExpress Treelist 会定期抛出 HideException?【英文标题】: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
,它有什么好处?
【问题讨论】:
【参考方案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】:我会说是
-
一个错误
用于以调用 Response.Redirect 将引发 ThreadAbort 异常以停止所有代码执行的方式发出消息信号。
【讨论】:
【参考方案3】:在我看来他们正在使用异常来控制程序流程。文档中的一些注释指出它会阻止调用基类方法。这太可怕了。无例外地执行此操作的 .NET 框架方法是 OnMouseWheel() 使用的 HandledMouseEventArgs 类。
【讨论】:
以上是关于为啥 DevExpress Treelist 会定期抛出 HideException?的主要内容,如果未能解决你的问题,请参考以下文章