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

  • 相关阅读:
    【转】15 个 JavaScript Web UI 库
    【转】C# WebRequest发起Http Post请求模拟登陆并cookie处理示例
    【转】33个JavaScript自动完成脚本
    大数据运算问题
    页面占位符的使用
    sql 数据库默认值问题
    jquery动态绑定像Repeater和dataList一样绑定数据源
    seo页面优化的要点
    asp.net控件不可乱用的属性
    jquery经验篇
  • 原文地址:https://www.cnblogs.com/yezhu008/p/5799567.html
Copyright © 2011-2022 走看看