winform实现listview中combox
2016-08-23 15:31
274 查看
一、概要
因为要在项目中要在ListView中实现下拉框选择,用DataGrid的话,一个不美观,二个绑定数据麻烦,参考网上一种做法,就是单击ListView时,判断单击的区域,然后将Combox控件显示单击的区域,以模拟效果,很少写winform,写的不好,望大家不要笑话。二、准备控件
先在容器中拖入一个ListView控件和Combox控件,然后设置Combox控件的Visible属性为False,即隐藏Combox控件,如图:随便填充点数据到ListView和Combox中,如下:
this.listView1.SmallImageList = imageList1; this.comboBox2.Items.Add("苹果"); this.comboBox2.Items.Add("香蕉"); this.comboBox2.Items.Add("橘子"); this.comboBox2.Items.Add("葡萄"); ListViewItem item; item = new ListViewItem(1.ToString()); item.SubItems.Add("苹果"); item.SubItems.Add("香蕉"); listView1.Items.Add(item); item = new ListViewItem(2.ToString()); item.SubItems.Add("橘子"); item.SubItems.Add("葡萄"); listView1.Items.Add(item);
三、封装ListViewCombox类
该类主要实现点击后将Combox控件显示到点击的区域中,同时,将Combox的SelectedIndexChanged和Leave事件也实现在该类中,代码如下:public class ListViewCombox { ListView _listView; ComboBox _combox; int _showColumn = 0; ListViewSubItem _selectedSubItem; /// <summary> /// 列表combox /// </summary> /// <param name="listView">listView控件</param> /// <param name="combox">要呈现的combox控件</param> /// <param name="showColumn">要在哪一列显示combox(从0开始)</param> public ListViewCombox(ListView listView, ComboBox combox, int showColumn) { _listView = listView; _combox = combox; _showColumn = showColumn; BindComboxEvent(); } /// <summary> /// 定位combox /// </summary> /// <param name="x">点击的x坐标</param> /// <param name="y">点击的y坐标</param> public void Location(int x, int y) { ListViewItem item = _listView.GetItemAt(x, y); if (item != null) { _selectedSubItem = item.GetSubItemAt(x, y); if (_selectedSubItem != null) { int clickColumn = item.SubItems.IndexOf(_selectedSubItem); if (clickColumn == 0) { _combox.Visible = false; } else if (clickColumn == _showColumn) { int padding = 2; Rectangle rect = _selectedSubItem.Bounds; rect.X += _listView.Left + padding; rect.Y += _listView.Top + padding; rect.Width = _listView.Columns[clickColumn].Width + padding; if (_combox != null) { _combox.Bounds = rect; _combox.Text = _selectedSubItem.Text; _combox.Visible = true; _combox.BringToFront(); _combox.Focus(); } } } } } private void BindComboxEvent() { if (_combox != null) { _combox.SelectedIndexChanged += combox_SelectedIndexChanged; _combox.Leave += combox_Leave; } } private void combox_Leave(object sender, EventArgs e) { if (_selectedSubItem != null) { _selectedSubItem.Text = _combox.Text; _combox.Visible = false; } } private void combox_SelectedIndexChanged(object sender, EventArgs e) { if (_selectedSubItem != null) { _selectedSubItem.Text = _combox.Text; _combox.Visible = false; } } }
四、使用
在容器代码中,先声明一个ListViewCombox类的全局实例,并在构造函数中实例化,最后在ListView中MouseUp事件中实现定位,如图:五、效果
因为上一步实例化ListViewCombox类时我传入的显示列为1,所以在ListView控件中单击第二列时就会产生下拉效果,如图:六、总结
很少写winform,但我感觉代码都是相通的,最主要的是理解你要实现什么,然后进行抽象和封装,希望对大家能有所帮助,也请高手对我进行指导,谢谢!相关文章推荐
- 看漫画,学 Redux
- Android Activity 全屏参数分析
- pdf转换成excel格式的最简单方法
- Block两种定义
- CentOS下架设Telnet服务器
- 动态申请二维数组两种方法
- Linux系统结构 详解
- 二叉树的存储结构
- Looper究竟是有什么作用
- CentOS6.8下安装DNS服务器
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
- Bootstrap下自动补全的演示调整
- 【Linux c】代码规范
- 道路覆盖--解题报告
- Activiti 中的ACT_RU_TASK表中的EXECUTION_ID和PROC_INST_ID区别
- cisco工程模式,删除镜像和恢复镜像
- python爬虫之BeautifulSoup
- Win10走红背后,最开心的人却是谷歌
- MyBatis关联查询,表字段相同,resultMap映射问题的解决办法
- GCC编译C/C++代码