VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#中ListView控件中加入ComboBox

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  很多项目中要用到ListView控件来呈现并编辑数据。为方便用户的输入,可在ListView控件中加入Combobox来提高其用户操作性。实现的效果图:

c#中ListView控件加入ComboBox

  1.建立一用户控件,命名MyListView,继承自ListView控件。

  直接贴出代码:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
  
namespace InheritedListView
{
  /// <summary>
  /// Summary description for UserControl1.
  /// </summary>
  public class MyListView : System.Windows.Forms.ListView
  {
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;
  
    public MyListView()
    {
      // This call is required by the Windows.Forms Form Designer.
      InitializeComponent();
  
      // TODO: Add any initialization after the InitForm call
    }
  
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose(bool disposing)
    {
      if (disposing)
      {
        if (components != null)
          components.Dispose();
      }
      base.Dispose(disposing);
    }
  
    #region Component Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      components = new System.ComponentModel.Container();
    }
    #endregion
  
    private const int WM_HSCROLL = 0x114;
    private const int WM_VSCROLL = 0x115;
  
    protected override void WndProc(ref Message msg)
    {
      // Look for the WM_VSCROLL or the WM_HSCROLL messages.
      if ((msg.Msg == WM_VSCROLL) || (msg.Msg == WM_HSCROLL))
      {
        // Move focus to the ListView to cause ComboBox to lose focus.
        this.Focus();
      }
  
      // Pass message to default handler.
      base.WndProc(ref msg);
    }
  }
}

 

  2.建立一新的Windows应用程序项目。添加刚才创建的MyListView控件的引用。拖入MyListView控件和一ComboBox控件,令ComboBox Visible设为false。

  直接贴出代码:

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
  {
    private ListViewItem lvItem;
    public Form1()
    {
      InitializeComponent();
      // Add a few items to the combo box list.
      this.cbListViewCombo.Items.Add("NC");
      this.cbListViewCombo.Items.Add("WA");
  
      // Set view of ListView to Details.
      this.myListView1.View = View.Details;
  
      // Turn on full row select.
      this.myListView1.FullRowSelect = true;
  
      // Add data to the ListView.
      ColumnHeader columnheader;
      ListViewItem listviewitem;
  
      // Create sample ListView data.
      listviewitem = new ListViewItem("NC");
      listviewitem.SubItems.Add("North Carolina");
      this.myListView1.Items.Add(listviewitem);
  
      listviewitem = new ListViewItem("WA");
      listviewitem.SubItems.Add("Washington");
      this.myListView1.Items.Add(listviewitem);
  
      // Create column headers for the data.
      columnheader = new ColumnHeader();
      columnheader.Text = "State Abbr.";
      this.myListView1.Columns.Add(columnheader);
  
      columnheader = new ColumnHeader();
      columnheader.Text = "State";
      this.myListView1.Columns.Add(columnheader);
  
      // Loop through and size each column header to fit the column header text.
      foreach (ColumnHeader ch in this.myListView1.Columns)
      {
        ch.Width = -2;
      }
  
    }
  
    private void cbListViewCombo_SelectedValueChanged(object sender, EventArgs e)
    {
      // Set text of ListView item to match the ComboBox.
      lvItem.Text = this.cbListViewCombo.Text;
  
      // Hide the ComboBox.
      this.cbListViewCombo.Visible = false;
  
    }
  
    private void cbListViewCombo_SelectedIndexChanged(object sender, EventArgs e)
    {
      // Set text of ListView item to match the ComboBox.
      lvItem.Text = this.cbListViewCombo.Text;
  
      // Hide the ComboBox.
      this.cbListViewCombo.Visible = false;
    }
  
    private void cbListViewCombo_KeyPress(object sender, KeyPressEventArgs e)
    {
      // Verify that the user presses ESC.
      switch (e.KeyChar)
      {
        case (char)(int)Keys.Escape:
          {
            // Reset the original text value, and then hide the ComboBox.
            this.cbListViewCombo.Text = lvItem.Text;
            this.cbListViewCombo.Visible = false;
            break;
          }
  
        case (char)(int)Keys.Enter:
          {
            // Hide the ComboBox.
            this.cbListViewCombo.Visible = false;
            break;
          }
      }
  
    }
  
    private void myListView1_MouseUp(object sender, MouseEventArgs e)
    {
      lvItem = this.myListView1.GetItemAt(e.X, e.Y);
  
      // Make sure that an item is clicked.
      if (lvItem != null)
      {
  
        // Get the bounds of the item that is clicked.
        Rectangle ClickedItem = lvItem.Bounds;
  
        //单击ListView第一列显示ComBoBox控件
        if (e.X > this.myListView1.Columns[0].Width)
        {
          return;
        }
        // Verify that the column is completely scrolled off to the left.
        if ((ClickedItem.Left + this.myListView1.Columns[0].Width) < 0)
        {
          // If the cell is out of view to the left, do nothing.
          return;
        }         // Verify that the column is partially scrolled off to the left.
        else if (ClickedItem.Left < 0)
        {
          // Determine if column extends beyond right side of ListView.
          if ((ClickedItem.Left + this.myListView1.Columns[0].Width) > this.myListView1.Width)
          {
            // Set width of column to match width of ListView.
            ClickedItem.Width = this.myListView1.Width;
            ClickedItem.X = 0;
          }
          else
          {
            // Right side of cell is in view.
            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;
        }
  
        // Adjust the top to account for the location of the ListView.
        ClickedItem.Y += this.myListView1.Top;
        ClickedItem.X += this.myListView1.Left;
  
        // Assign calculated bounds to the ComboBox.
        this.cbListViewCombo.Bounds = ClickedItem;
  
        // Set default text for ComboBox to match the item that is clicked.
        this.cbListViewCombo.Text = lvItem.Text;
  
        // Display the ComboBox, and make sure that it is on top with focus.
        this.cbListViewCombo.Visible = true;
        this.cbListViewCombo.BringToFront();
        this.cbListViewCombo.Focus();
  
      }
    }
  
    private void myListView1_Click(object sender, EventArgs e)
    {
      //this.myListView1.Select();
      this.cbListViewCombo.Visible = false;
    }
  }
}

 

  2.建立一新的Windows应用程序项目。添加刚才创建的MyListView控件的引用。拖入MyListView控件和一ComboBox控件,令ComboBox Visible设为false。

  直接贴出代码:

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
  {
    private ListViewItem lvItem;
    public Form1()
    {
      InitializeComponent();
      // Add a few items to the combo box list.
      this.cbListViewCombo.Items.Add("NC");
      this.cbListViewCombo.Items.Add("WA");
  
      // Set view of ListView to Details.
      this.myListView1.View = View.Details;
  
      // Turn on full row select.
      this.myListView1.FullRowSelect = true;
  
      // Add data to the ListView.
      ColumnHeader columnheader;
      ListViewItem listviewitem;
  
      // Create sample ListView data.
      listviewitem = new ListViewItem("NC");
      listviewitem.SubItems.Add("North Carolina");
      this.myListView1.Items.Add(listviewitem);
  
      listviewitem = new ListViewItem("WA");
      listviewitem.SubItems.Add("Washington");
      this.myListView1.Items.Add(listviewitem);
  
      // Create column headers for the data.
      columnheader = new ColumnHeader();
      columnheader.Text = "State Abbr.";
      this.myListView1.Columns.Add(columnheader);
  
      columnheader = new ColumnHeader();
      columnheader.Text = "State";
      this.myListView1.Columns.Add(columnheader);
  
      // Loop through and size each column header to fit the column header text.
      foreach (ColumnHeader ch in this.myListView1.Columns)
      {
        ch.Width = -2;
      }
  
    }
  
    private void cbListViewCombo_SelectedValueChanged(object sender, EventArgs e)
    {
      // Set text of ListView item to match the ComboBox.
      lvItem.Text = this.cbListViewCombo.Text;
  
      // Hide the ComboBox.
      this.cbListViewCombo.Visible = false;
  
    }
  
    private void cbListViewCombo_SelectedIndexChanged(object sender, EventArgs e)
    {
      // Set text of ListView item to match the ComboBox.
      lvItem.Text = this.cbListViewCombo.Text;
  
      // Hide the ComboBox.
      this.cbListViewCombo.Visible = false;
    }
  
    private void cbListViewCombo_KeyPress(object sender, KeyPressEventArgs e)
    {
      // Verify that the user presses ESC.
      switch (e.KeyChar)
      {
        case (char)(int)Keys.Escape:
          {
            // Reset the original text value, and then hide the ComboBox.
            this.cbListViewCombo.Text = lvItem.Text;
            this.cbListViewCombo.Visible = false;
            break;
          }
  
        case (char)(int)Keys.Enter:
          {
            // Hide the ComboBox.
            this.cbListViewCombo.Visible = false;
            break;
          }
      }
  
    }
  
    private void myListView1_MouseUp(object sender, MouseEventArgs e)
    {
      lvItem = this.myListView1.GetItemAt(e.X, e.Y);
  
      // Make sure that an item is clicked.
      if (lvItem != null)
      {
  
        // Get the bounds of the item that is clicked.
        Rectangle ClickedItem = lvItem.Bounds;
  
        //单击ListView第一列显示ComBoBox控件
        if (e.X > this.myListView1.Columns[0].Width)
        {
          return;
        }
        // Verify that the column is completely scrolled off to the left.
        if ((ClickedItem.Left + this.myListView1.Columns[0].Width) < 0)
        {
          // If the cell is out of view to the left, do nothing.
          return;
        }         // Verify that the column is partially scrolled off to the left.
        else if (ClickedItem.Left < 0)
        {
          // Determine if column extends beyond right side of ListView.
          if ((ClickedItem.Left + this.myListView1.Columns[0].Width) > this.myListView1.Width)
          {
            // Set width of column to match width of ListView.
            ClickedItem.Width = this.myListView1.Width;
            ClickedItem.X = 0;
          }
          else
          {
            // Right side of cell is in view.
            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;
        }
  
        // Adjust the top to account for the location of the ListView.
        ClickedItem.Y += this.myListView1.Top;
        ClickedItem.X += this.myListView1.Left;
  
        // Assign calculated bounds to the ComboBox.
        this.cbListViewCombo.Bounds = ClickedItem;
  
        // Set default text for ComboBox to match the item that is clicked.
        this.cbListViewCombo.Text = lvItem.Text;
  
        // Display the ComboBox, and make sure that it is on top with focus.
        this.cbListViewCombo.Visible = true;
        this.cbListViewCombo.BringToFront();
        this.cbListViewCombo.Focus();
  
      }
    }
  
    private void myListView1_Click(object sender, EventArgs e)
    {
      //this.myListView1.Select();
      this.cbListViewCombo.Visible = false;
    }
  }
}



相关教程