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;
}
}
}
posted on 2008-02-22 16:47 chunzhao.zhang 阅读(9193) 评论(0) 编辑 收藏 举报