一、概要
因为要在项目中要在ListView中实现下拉框选择,用DataGrid的话,一个不美观,二个绑定数据麻烦,参考网上一种做法,就是单击ListView时,判断单击的区域,然后将Combox控件显示单击的区域,以模拟效果,很少写winform,写的不好,望大家不要笑话。
二、准备控件
先在容器中拖入一个ListView控件和Combox控件,然后设置Combox控件的Visible属性为False,即隐藏Combox控件,如图:
随便填充点数据到ListView和Combox中,如下:
1 this.listView1.SmallImageList = p_w_picpathList1; 2 this.comboBox2.Items.Add("苹果"); 3 this.comboBox2.Items.Add("香蕉"); 4 this.comboBox2.Items.Add("橘子"); 5 this.comboBox2.Items.Add("葡萄"); 6 ListViewItem item; 7 item = new ListViewItem(1.ToString()); 8 item.SubItems.Add("苹果"); 9 item.SubItems.Add("香蕉");10 listView1.Items.Add(item);11 item = new ListViewItem(2.ToString());12 item.SubItems.Add("橘子");13 item.SubItems.Add("葡萄");14 listView1.Items.Add(item);
三、封装ListViewCombox类
该类主要实现点击后将Combox控件显示到点击的区域中,同时,将Combox的SelectedIndexChanged和Leave事件也实现在该类中,代码如下:
1 public class ListViewCombox 2 { 3 ListView _listView; 4 ComboBox _combox; 5 int _showColumn = 0; 6 ListViewSubItem _selectedSubItem; 7 8 /// <summary> 9 /// 列表combox10 /// </summary>11 /// <param name="listView">listView控件</param>12 /// <param name="combox">要呈现的combox控件</param>13 /// <param name="showColumn">要在哪一列显示combox(从0开始)</param>14 public ListViewCombox(ListView listView, ComboBox combox, int showColumn) {15 _listView = listView;16 _combox = combox; 17 _showColumn = showColumn; 18 BindComboxEvent();19 }20 21 /// <summary>22 /// 定位combox23 /// </summary>24 /// <param name="x">点击的x坐标</param>25 /// <param name="y">点击的y坐标</param>26 public void Location(int x, int y) {27 ListViewItem item = _listView.GetItemAt(x, y);28 if (item != null) {29 _selectedSubItem = item.GetSubItemAt(x, y);30 if (_selectedSubItem != null) {31 int clickColumn = item.SubItems.IndexOf(_selectedSubItem);32 if (clickColumn == 0) {33 _combox.Visible = false;34 }35 else if (clickColumn == _showColumn) {36 int padding = 2;37 Rectangle rect = _selectedSubItem.Bounds;38 rect.X += _listView.Left + padding;39 rect.Y += _listView.Top + padding;40 rect.Width = _listView.Columns[clickColumn].Width + padding;41 if (_combox != null) {42 _combox.Bounds = rect;43 _combox.Text = _selectedSubItem.Text;44 _combox.Visible = true;45 _combox.BringToFront();46 _combox.Focus();47 }48 }49 }50 }51 }52 53 private void BindComboxEvent() {54 if (_combox != null) {55 _combox.SelectedIndexChanged += combox_SelectedIndexChanged;56 _combox.Leave += combox_Leave;57 }58 }59 60 private void combox_Leave(object sender, EventArgs e) {61 if (_selectedSubItem != null) {62 _selectedSubItem.Text = _combox.Text;63 _combox.Visible = false;64 }65 }66 67 private void combox_SelectedIndexChanged(object sender, EventArgs e) {68 if (_selectedSubItem != null) {69 _selectedSubItem.Text = _combox.Text;70 _combox.Visible = false;71 }72 } 73 }
四、使用
在容器代码中,先声明一个ListViewCombox类的全局实例,并在构造函数中实例化,最后在ListView中MouseUp事件中实现定位,如图:
五、效果
因为上一步实例化ListViewCombox类时我传入的显示列为1,所以在ListView控件中单击第二列时就会产生下拉效果,如图:
六、总结
很少写winform,但我感觉代码都是相通的,最主要的是理解你要实现什么,然后进行抽象和封装,希望对大家能有所帮助,也请高手对我进行指导,谢谢!