ExCB - 扩展的多列组合框






4.77/5 (29投票s)
提供一个易于使用、灵活、可过滤的组合框,管理各种数据类型(包括图像),还支持列排序、调整大小和重新排序。
引言
该组件是用 VB.NET 编写的,最早在 2008 年推出。但最近,我决定引入一些新功能,尤其是在ListView
部分。部分原因列于下文。
- 需要显示
图像
和良好的“CheckBox
”,而不仅仅是使用 Wingdings 字体字符产生的效果。 - 鉴于使用不同的字体和字号,需要自动调整子组件的高度。
- 需要“正确”排序
文本
、数字
和日期/时间
列。 - 一个让所有人都烦恼的事实:在 Windows XP 上的 Visual Studio 2008 中,增加字号不会改变
ListView
标题栏的高度。真烦人……因此,我也决定强制设置标题栏高度。
因此,该控件不仅仅是“又一个ComboBox
”,而是一个增强的、灵活的、强大的且易于使用的组件。
- 它支持各种数据类型:
文本
、数字
、日期/时间
、图像
和布尔值
。 图像
可以作为(实际)图像或通过路径引用发送。布尔值
显示为“checkbox
”,但有两种方式:通过图片(外观更好,可缩放),或通过 Wingdings 字体字符(性能更高)。- 内置行计数器。
- 可以通过在
TextBox
中键入字符来过滤行,以减少列表。 - 用户可以控制列表标题栏的高度和颜色。
- 用户可以控制列表行的高度。
- 用户可以控制每列的前景色和背景色。
- 用户可以控制图像和“图片复选框”的大小和大小模式。
- 列可以被调整大小、重新排序和排序(升序/降序,带箭头指示器)。
数字
和日期
被“有效地”排序,而不管它们显示的格式如何。
当然,添加的图像越多,性能就越差……
编程
此外,代码尽可能简单,程序员可以找到一些相关的有用代码片段:
- 可扩展属性
- 渐变效果
- 颜色更改
- 嵌入式控件处理
HeaderControl
子类化(NativeWindow
)HDM_LAYOUT
捕获- 标题栏高度控制
- 标题栏排序箭头
- 列
文本
、日期
和数字
的有效排序
参见文档和示例
首先,下载.ZIP文件。
.ZIP 文件包含ExCB_Documentation.PDF,其中完整描述了该组件。
演示窗体展示了几个示例、技巧和数据处理技巧。
最新更新
- ExCB_Documentation.PDF 附录
过滤 - 要重置过滤,选择所有行,只需单击鼠标右键下拉列表。 - 启动提供的解决方案时,如果收到消息“输出类型为类库的项目不能直接启动”,则
转到解决方案资源管理器,选择ExCB_Test
项目,右键单击鼠标按钮,然后单击设置为启动项目。 - ExCB_Documentation.PDF 附录:请注意另一个事件
事件
DropDownCHANGED - 列表打开/关闭时发生。
语法DropDownChanged(IsDroppedDown as Boolean)
备注
-IsDroppedDown
=True
- 列表已打开
-IsDroppedDown
=False
- 列表已关闭 - 为避免错误,在非常特殊的情况下,请,
在类ExCB.vb
的属性SelectedIndex()
中,替换该行MyLV1.Items(value).Selected = True
用Try MyLV1.Items(value).Selected = True Catch End Try
- L.Botello 提问的回复
- ……似乎在某些情况下,当字号增大时,列表会被截断(底部)。对吗?
是的,这是一个错误。要修复它,请
在ExCB.vb
的“TextBox & Button code
”区域的Sub Button1_MouseDown
中,替换该行Dim LX As Integer = Sizes_.ListHeader_Height + 1 + MX * (_ListRowHeight + 1)
用Dim LX As Integer = Math.Max(Sizes.ListHeader_Height, _ TextRenderer.MeasureText(" ", Me.Font).Height + 4) + _ MX * (_ListRowHeight + 1)
- 您是否考虑过在窗体大小调整时(无论
MaxRowsDisp
属性值如何)增大/缩小列表的可能性?
感谢您的建议,这将改进控件的功能。
这将是一个选项。请这样做:
在类ExCB.vb
的“Public Methods
”区域,插入以下 SubPublic Sub AdjustListHeight() Try Dim Parent_csH As Integer = Me.ParentForm.ClientSize.Height ' Exclude TitleBar and Borders Dim HeaderH = Math.Max(Sizes.ListHeader_Height, TextRenderer.MeasureText(" ", Me.Font).Height + 4) Dim RestH As Integer = Parent_csH - Me.Top - MyLV1.Top - HeaderH _MaxDsp = RestH \ (_ListRowHeight + 1) Dim MinRows As Integer = Math.Min(_MaxDsp, MyLV1.Items.Count + 1) If MyLV1.Visible Then MyLV1.Height = HeaderH + MinRows * (_ListRowHeight + 1) Me.Height = _LblBoxH + MyLV1.Height Else _HideLV() End If Catch End Try End Sub
然后在您的窗体中,插入此代码并仅为您希望启用该功能的控件实例调用 Method。Private Sub Me_Sizes(sender As Object, e As EventArgs) Handles Me.Resize, Me.SizeChanged ExCB1.AdjustListHeight() ' ... ' ExCBn.AdjustListHeight() End Sub
无论如何,为首次显示(在第一次调整大小之前发生时……)定义MaxRowsDisp
值。
- ……似乎在某些情况下,当字号增大时,列表会被截断(底部)。对吗?
- 可供下载一个针对 VS2012 的新项目(源代码和演示),它是“原始”版本加上以上所有更新(包括 Method
AdjustListHeight
),再加上一个新的属性AutoComplete
,该属性赋予控件类似自动完成的功能:每当按下按键时,列表会下拉,仅显示与键入字符串匹配的行。匹配适用于任何子项(列)。将属性AutoComplete
设置为True
意味着属性Filterable
也设置为True
。在运行ExCB_Test
项目之前,请勿忘记将其设置为启动项目。
Using the Code
该组件提供 2 个版本:Visual Studio 2008 和 Visual Studio 2012。
所有功能在两个版本中都可用,但 2012 版本限制更少,更易于使用。
组件 DLL 位于... \ExCB\VS20xx\ExCB\bin\Release\ExCB.dll。
- 将其添加到您的工具箱,右键单击工具箱区域 -> 选择项… -> 浏览 -> 选择 DLL。
- 在解决方案资源管理器中,选择您的项目,打开我的项目 -> 引用 -> 添加… -> 浏览 -> 选择 DLL。
- 将组件从工具箱拖到您的窗体上。
组件自身属性、事件和方法的简要说明
可浏览属性
BorderStyle
应用于TextBox
子组件的边框样式。Colors
(可扩展属性)HeadBackColor
-ListView
标题栏的背景颜色。HeadForeColor
-ListView
标题栏的前景色。ListBackColor
-ListView
项目的背景颜色。ListForeColor
-ListView
项目的前景色。TBoxBackColor
-TextBox
元素的背景颜色。TBoxForeColor
-TextBox
元素的前景色。
CounterLoc
- 内置行Counter
相对于TextBox
的位置和对齐方式。DisplayColumn
- 在列表中选择一行时,要在TextBox
中显示的子项
(列
)的索引
。Filterable
- 指示ListView
行是否可以/不能被过滤。Font
- 定义所有子组件(ListView
、TextBox
和Counter
)的字体名称、大小和样式。GridLines
- 在ListView
中显示项目和子项周围的网格线。MaxRowsDisp
- 下拉列表时要显示的最大行数。MinimunWidth
- 组件的最小宽度。组件调整大小时会改变。Read_Only
- 当为True
时,组件不能下拉/更改,但会显示当前选择。Reordable
- 指示ListView
列是否可以/不能重新排序。Resizable
- 指示ListView
列是否可以/不能调整大小。Sizes
- (可扩展属性)Image_Height
- 发送到列表的图像的高度。Image_Width
- 发送到列表的图像的宽度。ListHeader_Height
-ListView
标题栏的高度。ListRow_Height
-ListView
行的高度。YesNo_Height
- “复选框”的高度(和宽度)。
Sortable
指示ListView
列是否可以/不能排序。
不可浏览属性
Count
- 获取列表中的行数。SelectedIndex
- 获取/设置当前选定行的索引。Text
- 获取/设置组件TextBox
部分中的文本。
事件
ItemSelected
- 行被选中/以编程方式取消选中时发生。DropDownChanged
- 列表打开/关闭时发生。
方法
AddColumn
- 创建一个新列(带 1 个必需参数和 13 个可选参数)。
语法AddColumn(HeaderText As String, [Width As Integer = 80], [Align As System.Windows.Forms.HorizontalAlignment = HorizontalAlignment.Left], [DataType As ExCB.ExCB.DataType = ExCB.ExCB.DataType._Text], [Format As String = Nothing], [ForeColor As System.Drawing.Color = Nothing], '(VS2012) [BackColor As System.Drawing.Color = Nothing], '(VS2012) [ImgWidth As Integer = 0], [ImgHeight As Integer = 0], [SizeMode As ExCB.ExCB.SizeMode = ExCB.ExCB.SizeMode._Stretch], [Resizable As Boolean = True], [Reordable As Boolean = True], [Sortable As Boolean = True], [ArrowOnRight As Boolean = False])
AddRow
- 向ListView
添加一行(项目)(发送String
或Object
数组)。ARGB
- 将Color
转换为其整数值。Clear
- 删除列表中的所有行(包括嵌入式控件),可选地删除所有列。RowSelect
- 选择一行,提供一个值和一个列索引,可选地返回另一个子项。GetImage
- 检索组件数组中指定索引处的图像。
历史
2014 年 6 月 3 日 - 首次发布
2014 年 6 月 5 日 - 在参见文档和示例中添加了最新更新 1. 和 2.。
2014 年 6 月 11 日 - 在 参见文档和示例中添加了最新更新 3. 和 4.。
2014 年 12 月 5 日 - 在 参见文档和示例中添加了最新更新 5.。
2016 年 3 月 21 日 - 在 参见文档和示例中添加了最新更新 6.。