65.9K
CodeProject 正在变化。 阅读更多。
Home

ExCB - 扩展的多列组合框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (29投票s)

2014年6月3日

CPOL

6分钟阅读

viewsIcon

86364

downloadIcon

3707

提供一个易于使用、灵活、可过滤的组合框,管理各种数据类型(包括图像),还支持列排序、调整大小和重新排序。

Sample Image - maximum width is 600 pixels

引言

该组件是用 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,其中完整描述了该组件。
演示窗体展示了几个示例、技巧和数据处理技巧。

最新更新

  1. ExCB_Documentation.PDF 附录
    过滤 - 要重置过滤,选择所有行,只需单击鼠标右键下拉列表。
  2. 启动提供的解决方案时,如果收到消息“输出类型为类库的项目不能直接启动”,则
    转到解决方案资源管理器,选择ExCB_Test 项目,右键单击鼠标按钮,然后单击设置为启动项目
  3. ExCB_Documentation.PDF 附录:请注意另一个事件
    事件DropDownCHANGED - 列表打开/关闭时发生。
    语法
    	DropDownChanged(IsDroppedDown as Boolean)
    备注
    - IsDroppedDown = True - 列表已打开
    - IsDroppedDown = False - 列表已关闭
  4. 为避免错误,在非常特殊的情况下,请,
    在类ExCB.vb的属性SelectedIndex()中,替换该行
    	MyLV1.Items(value).Selected = True
    	Try
    	    MyLV1.Items(value).Selected = True
    	Catch
    	End Try
  5. L.Botello 提问的回复
    1. ……似乎在某些情况下,当字号增大时,列表会被截断(底部)。对吗?
      是的,这是一个错误。要修复它,请
      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)
      
    2. 您是否考虑过在窗体大小调整时(无论MaxRowsDisp属性值如何)增大/缩小列表的可能性?
      感谢您的建议,这将改进控件的功能。
      这将是一个选项。请这样做:
      在类ExCB.vb的“Public Methods”区域,插入以下 Sub
      Public 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值。
  6. 可供下载一个针对 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 - 定义所有子组件(ListViewTextBoxCounter)的字体名称、大小和样式。
  • 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 添加一行(项目)(发送StringObject数组)。
  • 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.。

© . All rights reserved.