写在前面:多列ComboBox是winform开发中经常会使用到的,而标准版本的ComboBox是不支持多列显示的,这样就需要自定义了。不过关于多列ComboBox的解决方法已经很多了,只要google一下MultiCombobox就可以看到很多结果了。下面就不同的多列ComboBox解决办法,做一个简单的介绍并说明优缺点。
两个解决方案
方案1
接收的数据源是多列的,如DataTable之类,重写ComboBox的DropDownItem,对下拉的内容重绘, 根据数据列的长度或传入的参数设置下拉的长度和宽度。此方案是传统的,基础上都是重写ComboBox的方法,而没有什么创新的地方。不过,这也是最保险和安全的,控件运行的可靠性比较高。
典型例子
http://www.codeproject.com/KB/combobox/MultiColumnComboBoxLinked.aspx
方案2
使用组合型的控件,接收的数据源是多列的,也是继承ComboBox的,如果控件还没下拉,基本上就是传统的控件,不过,一下拉,出现的不是DropDown的Item,而是一个Form,因为Form是可以自由定位的。这种方法就要思考到控件如果发生位移或Focus变动,就要合理安排这个Form的位置了。
典型例子
http://www.codeproject.com/KB/combobox/multicolumncombo.aspx
效果图
下图就是使用重写DropDownItem的方案来做的,其最大的优点是安全性高,稳定性高。但是控件的表达能力不是很强的。如DropDownItem不可能出现标题的,就算以第一列为标题,当滚动条下拉时,这个问题还是不能解决的。另外,多列ComboBox一般都需要有搜索功能的,这种重写DropDownItem的方法,好像很难表达的搜索,如果在ComboBox上面直接输入内容,那ComboBox原有的文字怎么解决呢,这是一个头大的问题。如果事实上,这个多列ComboBox的内容是有值域的,只能选择不能自由输入的。
下图是搜索内容的界面,这样的话,实在是很不方便的。又鼠标又键盘,真是麻烦的。而这下界面也给了另一个解决方案Form下拉

下图是下拉一个Form的效果,下拉的位置不太正确,可以通过代码调整一下就可以了。不过,这样的界面也令观察者一眼可以看到下拉的东西就是一个Form,只要解决好位移,大小变化,焦点等问题,使这个下拉的Form及时关闭,估计也是没什么问题的。而原下拉的功能基本是被屏蔽的,一般也把下拉的区域设置到很小,如1,1。这样,在下拉时,基本上看不出原来的下拉条。在Form选定内容之后设置到ComboBox的Text并激发事件就可以了。
至于搜索与新速定位的功能,因为下拉的东西是一个Form要实现也不会很麻烦。
一个需要注意的问题是,下拉的东西是相对比较简单的,不可以让普通人都觉得这个是一个Form。所以就要注意到焦点的问题。
