listview中的单元格没有编辑功能,因此经常需要弹出下拉框。
下面一段程序演示的是在listview中的第二列弹出combobox。
1 新建一个项目,窗体默认名为Form1,拖一个listview,脱一个combobox,拖一个imagelist(是为了是listview看起来更加美观)
2 设置listview1的属性,View属性设为Detail,GridLine设为true,FullRowSelect设为true,SmallImageList设为刚拖进来的imagelist1
3 设置imagelist的属性,高度改为20
4 给listview1添加三个列:columnHeader1 columnHeader2 columnHeader3
5 给combobox2和listview1添加几个item
6 添加listview1的MouseUp事件的响应(不能用MouseDwon,具体原因可以自己试一下)
7 添加combobox的SelectedIndexChanged和Leave事件的响应
重点在于listview1的MouseUp事件
思路是当鼠标点下是,首先判断是否选中了listview中的某一个item,如果选中,获取选中行的bounds,然后再判断是否落在了想要弹出combobox的列内,如果正好落入,则修改bounds使其与该列的某一单元格大小相同,最后设置combobox框的bounds为刚才的bounds,并将combobox设置为可见,当combobox的Leave事件触发时,设为不可见
下面是整个类的代码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication3{ public partial class Form1 : Form { ListViewItem m_SelectedItem; public Form1() { InitializeComponent(); InitComboboxAndListView(); } private void InitComboboxAndListView() { this.listView1.SmallImageList = imageList1; this.comboBox1.Items.Add("科比"); this.comboBox1.Items.Add("姚明"); this.comboBox1.Items.Add("杜兰特"); this.comboBox1.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); } private void listView1_MouseUp(object sender, MouseEventArgs e) { try { m_SelectedItem = this.listView1.GetItemAt(e.X, e.Y);//先判断是否有选中行 if (m_SelectedItem != null) { //获取选中行的Bounds Rectangle Rect = m_SelectedItem.Bounds; //第二列的左侧X坐标 int LX = listView1.Columns[0].Width; //第二列的右侧X坐标 int RX = listView1.Columns[0].Width + listView1.Columns[1].Width; //判断是否点在第二列 if (e.X > RX || e.X < LX) { this.comboBox1.Visible = false; return; } else { //修改Rect的范围使其与第二列的单元格的大小相同,为了好看 ,左边缩进了2个单位 Rect.X += listView1.Left + listView1.Columns[0].Width+2; Rect.Y+= this.listView1.Top+2; Rect.Width = listView1.Columns[1].Width+2; this.comboBox1.Bounds = Rect; this.comboBox1.Text = m_SelectedItem.SubItems[1].Text; this.comboBox1.Visible = true; this.comboBox1.BringToFront(); this.comboBox1.Focus(); } } } catch { } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { m_SelectedItem.SubItems[1].Text = comboBox1.Text; comboBox1.Visible = false; } private void comboBox1_Leave(object sender, EventArgs e) { m_SelectedItem.SubItems [1].Text = comboBox1.Text; comboBox1.Visible = false; } }}
下面是效果图: