winform实现listview中combox

一、概要

因为要在项目中要在ListView中实现下拉框选择,用DataGrid的话,一个不美观,二个绑定数据麻烦,参考网上一种做法,就是单击ListView时,判断单击的区域,然后将Combox控件显示单击的区域,以模拟效果,很少写winform,写的不好,望大家不要笑话。

二、准备控件

先在容器中拖入一个ListView控件和Combox控件,然后设置Combox控件的Visible属性为False,即隐藏Combox控件,如图:

随便填充点数据到ListView和Combox中,如下:

 1             this.listView1.SmallImageList = imageList1;
 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         /// 列表combox
10         /// </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         /// 定位combox
23         /// </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,但我感觉代码都是相通的,最主要的是理解你要实现什么,然后进行抽象和封装,希望对大家能有所帮助,也请高手对我进行指导,谢谢!

时间: 2024-08-30 11:11:00

winform实现listview中combox的相关文章

.NET winform 在listview中添加progressbar

找了好长时间没找到,后来索性自己写了一个: 首先,在往listview加载数据的事件里添加progressbar: foreach (string d in arr) { int index = lv.Items.Count + 1; item = new ListViewItem(new string[] { index.ToString(), d, "", "", "", "" }); lv.Items.Add(item)

C# 将Access中时间段条件查询的数据添加到ListView中

C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加Item. 首先,ListView的Item属性包括Items和SubItems.必须先实例化一个ListIteView对象.具体如下: ListViewItem listViewItem=new ListViewItem(); l

Web API应用架构在Winform混合框架中的应用(1)

在<Web API应用架构设计分析(1)>和<Web API应用架构设计分析(2)>中对WebAPI的架构进行了一定的剖析,在当今移动优先的口号下,传统平台都纷纷开发了属于自己的Web API平台,方便各种终端系统的接入,很多企业的需求都是以Web API优先的理念来设计整个企业应用体系的.Web API作为整个纽带的核心,在整个核心层需要考虑到统一性.稳定性.以及安全性等方面因素.本文主要介绍,Web API应用架构,在Winform整合中的角色,以及如何实现在Winform混合

Xamarin.Forms listview中的button按钮,实现带着参数返回上一级页面

今天在做列表显示的时候遇到一个问题,就是在ListView中如何才能让一个button的按钮工作并且包含参数呢? 其实有点类似于rep里的控件无法起获取一样.在Xamarin中,当你button绑定事件并不包含在listview的数据源中,那么这个按钮的事件便是无效的. 那么该怎么解决呢?找了一下午终于找到了解决方案 xaml: <AbsoluteLayout IsVisible="True" HorizontalOptions="EndAndExpand"&

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a

PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)

前言:经常说follow your heart.但等到真到这么一天的时候,却很艰难 相关文章: 1.<PullScrollView详解(一)--自定义控件属性>2.<PullScrollView详解(二)--Animation.Layout与下拉回弹>3.<PullScrollView详解(三)--PullScrollView实现>4.<PullScrollView详解(四)--完全使用listview实现下拉回弹(方法一)>5.<PullScroll

android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?

根据这个方法检测: 1 getListView().setOnScrollListener(new OnScrollListener() { 2 @Override 3 public void onScrollStateChanged(AbsListView view, int scrollState) { 4 } 5 6 @Override 7 public void onScroll(AbsListView view, int firstVisibleItem, int visibleIte

ImageLoader在Listview中的使用

图片加载框架之ImageLoader 1_特点 1)多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2)支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 3)支持图片的内存缓存,文件系统缓存或者SD卡缓存 4)支持图片下载过程的监听 5)根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存 6)较好的控制图片的加载过程,例如暂停图片加载,重

ListView中镶嵌GridView实现时间线功能问题总汇

看了网上的时间线,基本都非常的差劲,不如自己写一个,实现的效果如下,在实现的过程中遇到了2个大的问题:1.gridView显示不全2.listview的item不可点击,那么下面写出我解决这两个问题的办法 一.GridView显示不全的问题 GridView 显示不全是因为ListView和GridView都是可以滚动的,在android中不可以在一个可以滚动的控件中镶嵌另一个可以滚动的控件,那么我们可以通过自定义GridView设置为不滚动. MyGridView import android