一、概要

因为要在项目中要在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,但我感觉代码都是相通的,最主要的是理解你要实现什么,然后进行抽象和封装,希望对大家能有所帮助,也请高手对我进行指导,谢谢!