您的位置:首页 > 其它

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,但我感觉代码都是相通的,最主要的是理解你要实现什么,然后进行抽象和封装,希望对大家能有所帮助,也请高手对我进行指导,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: