如何在Listview中添加numericUpDown,ComboBox等

来源:互联网 发布:西班牙语翻译软件知乎 编辑:程序博客网 时间:2024/03/29 07:05

    刚在论坛看到有网友问到如何在ListView中添加numericUpDown控件,相信这个问题也是朋友遇到的问题吧,因此我就草草的写下这个控件供大家参考一下,也想和大家一起分享一下.本人也是一个学生,代码有不足之处也希望大家能提出更正,多多包涵!代码如下:

    自定义MyListView组件.由于numericUpDown控件不是ListView控件的一部分,因此它并不会与ListView一起滚动,所以用一下代码来实现一起滚动功能.

 

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;

namespace NumListView
{
    
public partial class MyListView : System.Windows.Forms.ListView
    
{
        
public MyListView()
        
{
            InitializeComponent();
        }


        
public MyListView(IContainer container)
        
{
            container.Add(
this);

            InitializeComponent();
        }


        
private const int WM_HSCROLL = 0x114;
        
private const int WM_VSCROLL = 0x115;

        
protected override void WndProc(ref Message msg)
        
{
            
// 寻找WM_VSCROLL或WM_HSCROLL信息。
            if ((msg.Msg == WM_VSCROLL) || (msg.Msg == WM_HSCROLL))
            
{
                
// 将焦点移至ListView以便让numericUpDown失去焦点。
                this.Focus();
            }


            
// 将信息传递给默认的处理函数。
            base.WndProc(ref msg);
        }

    }

}

 

   下面是窗体的代码:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace NumListView
{
    
public partial class Form1 : Form
    
{
        
private ListViewItem lvItem;

        
public Form1()
        
{
            InitializeComponent();
        }


        
private void myListView1_MouseUp(object sender, MouseEventArgs e)
        
{
            
// 取得列中被按下的项目。
            lvItem = this.myListView1.GetItemAt(e.X, e.Y);

            
// 确认确实有一个项目被按下。
            if (lvItem != null)
            
{
                
// 取得被按下之项目的周框。
                Rectangle ClickedItem = lvItem.Bounds;

                
// 检查此资料行是否已经完全被卷动至左侧之外。
                if ((ClickedItem.Left + this.myListView1.Columns[0].Width) < 0)
                
{
                    
// 如果储存格在左侧之外无法看到则不做任何处理。
                    return;
                }

                
// 检查此资料行是否部分被卷动至左侧之外。
                else if (ClickedItem.Left < 0)
                
{
                    
// 确认此数据行是否已延伸至 ListView 的右侧之外。
                    if ((ClickedItem.Left + this.myListView1.Columns[0].Width) > this.myListView1.Width)
                    
{
                        
// 将数据行的宽度设定成与 ListView 的宽度。
                        ClickedItem.Width = this.myListView1.Width;
                        ClickedItem.X 
= 0;
                    }

                    
else
                    
{
                        
// 储存格的右侧位于检视中。
                        ClickedItem.Width = this.myListView1.Columns[0].Width + ClickedItem.Left;
                        ClickedItem.X 
= 2;
                    }

                }

                
else if (this.myListView1.Columns[0].Width > this.myListView1.Width)
                
{
                    ClickedItem.Width 
= this.myListView1.Width;
                }

                
else
                
{
                    ClickedItem.Width 
= this.myListView1.Columns[0].Width;
                    ClickedItem.X 
= 2;
                }


                ClickedItem.Y 
+= this.myListView1.Top;
                ClickedItem.X 
+= this.myListView1.Left;

                
// 将计算后的周框指派给 numericUpDown。
                this.numericUpDown1.Bounds = ClickedItem;

                
// 设定 numericUpDown 的预设文字使其与被按下的项目相符合。
                this.numericUpDown1.Text = lvItem.Text;

                
// 显示出 numericUpDown,并确保它位于最顶层且拥有焦点。
                this.numericUpDown1.Visible = true;
                
this.numericUpDown1.BringToFront();
                
this.numericUpDown1.Focus();
            }

        }


        
private void numericUpDown1_Leave(object sender, EventArgs e)
        
{
            
// 设定 ListView 项目的文字使其符合 numericUpDown。
            lvItem.Text = this.numericUpDown1.Value.ToString();

            
// 将 numericUpDown 隐藏起来。
            this.numericUpDown1.Visible = false;
        }


        
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        
{
            
// 设定 ListView 项目的文字使其符合 numericUpDown。
            lvItem.Text = this.numericUpDown1.Value.ToString();

            
// 将 numericUpDown 隐藏起来。
            this.numericUpDown1.Visible = false;
        }


        
private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
        
{
            
// 确认使用者按下 ESC 键。
            if (e.KeyChar == (char)(Keys.Escape))
            
{
                
// 重设原始文字值并将 numericUpDown 隐藏起来。
                this.numericUpDown1.Value =Convert.ToDecimal( lvItem.Text);
                
this.numericUpDown1.Visible = false;
            }

            
// 确认使用者按下 ENTER 键。
            else if (e.KeyChar == (char)(Keys.Enter))
            
{
                
// 将 ComboBox 隐藏起来。
                this.numericUpDown1.Visible = false;
            }

        }


        
private void Form1_Load(object sender, EventArgs e)
        
{

            
// 将 ListView 控件设定成详细数据检视。
            this.myListView1.View = View.Details;

            
// 设定当按一下项目便选取项目和它的所有子项目。
            this.myListView1.FullRowSelect = true;

            ColumnHeader columnheader;
            ListViewItem lviewitem;

            
// 新增一些数据至 ListView 控件中。
            lviewitem = new ListViewItem("10");
            lviewitem.SubItems.Add(
"硬盘");
            
this.myListView1.Items.Add(lviewitem);

            lviewitem 
= new ListViewItem("8");
            lviewitem.SubItems.Add(
"内存");
            
this.myListView1.Items.Add(lviewitem);

            lviewitem 
= new ListViewItem("25");
            lviewitem.SubItems.Add(
"CPU");
            
this.myListView1.Items.Add(lviewitem);

            
// 建立数据行行首。
            columnheader = new ColumnHeader();
            columnheader.Text 
= "数量";
            columnheader.Width 
= 140;
            
this.myListView1.Columns.Add(columnheader);

            columnheader 
= new ColumnHeader();
            columnheader.Text 
= "名称";
            columnheader.Width 
= 300;
            
this.myListView1.Columns.Add(columnheader);
        }

    }

}

如果程序有什么不足之处,希望能帮我指出和更正!!!!

我把以上程序打包成RAR  http://dl2.csdn.net/down4/20070817/17152200606.rar

原创粉丝点击