C# 为什么DevExpress树列表定期抛出隐藏异常?
我一直在处理代码,很好奇为什么它会抛出一个C# 为什么DevExpress树列表定期抛出隐藏异常?,c#,.net,winforms,exception-handling,devexpress,C#,.net,Winforms,Exception Handling,Devexpress,我一直在处理代码,很好奇为什么它会抛出一个DevExpress.Utils.HideException 我的理解是,异常非常昂贵,应该谨慎使用,并且只能在某些情况下使用,但下面的代码snippit表明,我们总是抛出HideException,而不会触发任何特定事件或代码 从FilterTreeList.cs 他们为什么在这里抛出一个隐藏异常,它有什么好处呢?我想说这是 虫子 用于向调用Response.Redirect将引发ThreadAbort异常以停止所有代码执行的方式发送消息 在我看来,他
DevExpress.Utils.HideException
我的理解是,异常非常昂贵,应该谨慎使用,并且只能在某些情况下使用,但下面的代码snippit表明,我们总是抛出HideException
,而不会触发任何特定事件或代码
从FilterTreeList.cs
他们为什么在这里抛出一个隐藏异常,它有什么好处呢?我想说这是
在我看来,他们正在使用异常来控制程序流。文档中有人注意到它会阻止基类方法被调用。那太可怕了。.NET framework实现这一点的方法是HandledMouseEventArgs类,由OnMouseWheel()使用。它是一种程序流机制,用于清除控件的环境。尽管与普通代码相比,异常确实是昂贵的(原型示例是在将字符串转换为int的循环中使用FormatExceptions——因此需要TryParse类型的方法),但与UI中的主要更改、从数据库获取数据等相比,异常非常便宜,易于维护 您引用的演示代码就是这样一个场景:控件即将刷新其全部内容。最终用户点击了一个特定的图标来执行一个特定的操作——根本不会“总是”抛出异常。我对这个示例代码的唯一不满之处(我强调它是示例代码)是操作是在鼠标按下时完成的,而不是在鼠标上升时完成的 我想争论的焦点是“异常是否可以用于这种宏程序流,或者我们是否应该制定一个严格的规则,规定它们只能用于错误报告?”但这是另一个问题 更新
WinForms团队告诉我:
HideException
是用于阻止默认鼠标事件处理的内部异常。我们同意这是一种老式的停止代码执行的方法,特别是考虑到我们已经有了DXMouseEventArgs
,能够设置e.Handled=true
。不幸的是,XtraTreeList当前不完全支持DXMouseEventArgs
。我们将在下一个次要版本中添加此功能,并相应地更新E2474示例
因此,在一个月左右的时间内,它将引起考古界的兴趣。示例代码是由DevExpress开发人员提交的吗?如果是这样,就让他们知道他们没有通过互联网代码审查(grin)。总而言之,您的支持和产品给我留下了深刻的印象,您(DevExpress团队)经常光顾Stack Overflow让我有一种+1的感觉。我相信这是DevExpress团队提交的。我很想听听他们的推理,他们为什么这样编码这个例子@boyetboy我最初的问题包括代码取自的链接,在那里你会看到操作同时在OnMouseUp()和OnMouseDown()中执行。WinForms团队告诉我:“HideException是用于阻止默认鼠标事件处理的内部异常。我们同意这是一种老式的停止代码执行的方法,特别是考虑到我们已经有了能够设置e.Handled=true的DXMouseEventArgs。不幸的是,XtraTreeList当前不完全支持DXMouseEventArgs。我们将在下一个小版本中添加此功能,并相应地更新E2474示例。“因此,在一个月左右的时间内,它将引起考古界的兴趣……我将您的评论添加到您的答案中,以便它具有一些永久性,希望您不介意。
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();
}
}