确定点击了哪个TabPage





5.00/5 (1投票)
一种二分查找技术,用于确定点击了TabControl的哪个TabPage
我正在开发的一个WinForms应用程序有很多TabControl,并且TabPages的数量是可变的(可能很多)。我想允许用户点击并拖动标签来重新排序TabPages。 快速查阅文档没有找到任何相关信息,并且在网上快速搜索后发现这是一个常见问题。 情况是TabPages不会接收鼠标事件,它们的父控件TabControl会接收,然后你必须使用TabControl的方法来确定点击了哪个TabPage。 我浏览了The Code Project上关于此主题的两篇文章,了解了其他人是如何实现这个功能的,它们提供了一个很好的起点,但是(因为是我)我提出了自己的解决方案。 我想要的是在
MouseDown
和MouseUp
时获取TabPage的索引。 最初,我实现了一个简单的迭代搜索TabPage,但今天我意识到使用二分查找技术会更好(至少在有大量TabPage的情况下),所以我进行了更改private static int
GetTabIndexAt
(
System.Windows.Forms.TabControl TabControl
,
System.Drawing.Point Point
)
{
int result = -1 ;
if ( TabControl != null )
{
int lo = 0 ;
int hi = TabControl.TabPages.Count - 1 ;
while ( ( result == -1 ) && ( lo <= hi ) )
{
int mid = lo + ( hi - lo ) / 2 ;
System.Drawing.Rectangle rect = TabControl.GetTabRect ( mid ) ;
if ( rect.Contains ( Point ) )
{
result = mid ;
}
else if ( ( Point.X < rect.Left ) || ( Point.Y < rect.Top ) )
{
hi = mid - 1 ;
}
else
{
lo = mid + 1 ;
}
}
}
return ( result ) ;
}
编辑:添加了( Point.Y < rect.Top )
的测试,以处理左对齐的标签--但它仍然只适用于单行或单列的标签。