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); } }}
注意 : 代码应更改 Visual Studio 2005 中。 当您创建 WindowsForms 项目, VisualC # 将一个表单添加到项目默认。 此表单名为 Form 1。 表示形式两文件命名为 Form 1 和 Form1.designer.cs。 Form 1 中编写代码。 Designer.cs 文件是其中 Windows 窗体设计器编写代码实现所有操作您执行通过添加控件。 请有关 WindowsForms 设计器在 Visual C# 2005, 访问以下 MicrosoftWeb 站点:
// 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;}
7.
将以下代码添加到 ComboBox 的 SelectedValueChanged 事件:
// Set text of ListView item to match the ComboBox.lvItem.Text = this.cbListViewCombo.Text; // Hide the ComboBox.this.cbListViewCombo.Visible = false;
8.
将以下代码添加到 保留 的 ComboBox 事件:
// Set text of ListView item to match the ComboBox.lvItem.Text = this.cbListViewCombo.Text;// Hide the ComboBox.this.cbListViewCombo.Visible = false;
9.
将以下代码添加到 ComboBox 的 KeyPress 事件:
// 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; }}
10.
将以下代码添加到的 myListView1 MouseUp 事件:
// Get the item on the row that is clicked.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; // 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();}