Спасибо за ссылку, но увы... Посмотрите мой проект, почему listView1, который кинут на форму - сортируется, а прицепленный к нему listView2 (объявлен в коде и на форму не кидался) не сортируется, хотя я его прицепил событиями и требую от него ортировки по тому же столбцу? Проект прилагается... Код | using System; using System.Collections.Generic; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace VirtualMode { public partial class Form1 : Form {
private ListViewColumnSorter lvwColumnSorter; private ListView listView2 = new ListView();
public Form1() { InitializeComponent(); //this.listView2.Location = new System.Drawing.Point(0, 121); this.listView2.Name = "listView2"; //this.listView2.Size = new System.Drawing.Size(292, 145); this.listView2.TabIndex = 0; this.listView2.UseCompatibleStateImageBehavior = false; this.listView2.View = System.Windows.Forms.View.Details; this.listView2.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView2_ColumnClick);
// Create an instance of a ListView column sorter and assign it // to the ListView control. lvwColumnSorter = new ListViewColumnSorter(); this.listView1.ListViewItemSorter = lvwColumnSorter; this.listView2.ListViewItemSorter = lvwColumnSorter; listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
}
void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { e.Item = listView2.Items[e.ItemIndex]; }
private void Form1_Load(object sender, EventArgs e) {
#region Populate listView controls
ColumnHeader columnheader; // Used for creating column headers. ListViewItem listviewitem; // Used for creating listview items.
// Ensure that the view is set to show details. listView1.View = View.Details;
// Create some listview items consisting of first and last names. listviewitem = new ListViewItem("John"); listviewitem.SubItems.Add("Smith"); this.listView2.Items.Add(listviewitem);
listviewitem = new ListViewItem("Bob"); listviewitem.SubItems.Add("Taylor"); this.listView2.Items.Add(listviewitem);
listviewitem = new ListViewItem("Kim"); listviewitem.SubItems.Add("Zimmerman"); this.listView2.Items.Add(listviewitem);
listviewitem = new ListViewItem("Olivia"); listviewitem.SubItems.Add("Johnson"); this.listView2.Items.Add(listviewitem);
foreach (ListViewItem item in listView2.Items) { listView1.Items.Add((ListViewItem)item.Clone()); }
// Create some column headers for the data. columnheader = new ColumnHeader(); columnheader.Text = "First Name"; this.listView1.Columns.Add(columnheader); this.listView2.Columns.Add((ColumnHeader)columnheader.Clone());
columnheader = new ColumnHeader(); columnheader.Text = "Last Name"; this.listView1.Columns.Add(columnheader); this.listView2.Columns.Add((ColumnHeader)columnheader.Clone());
#endregion Populate listViews controls
// Loop through and size each column header to fit the column header text. foreach (ColumnHeader ch in this.listView2.Columns) { ch.Width = -2; }
//listView1.Dock = DockStyle.Fill; listView1.VirtualListSize = listView1.Items.Count; //listView1.VirtualMode = true;
listView2.VirtualListSize = listView2.Items.Count; //listView.VirtualMode = true;
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) { // Determine if clicked column is already the column that is being sorted. if (e.Column == lvwColumnSorter.SortColumn) { // Reverse the current sort direction for this column. if (lvwColumnSorter.Order == SortOrder.Ascending) { lvwColumnSorter.Order = SortOrder.Descending; } else { lvwColumnSorter.Order = SortOrder.Ascending; } } else { // Set the column number that is to be sorted; default to ascending. lvwColumnSorter.SortColumn = e.Column; lvwColumnSorter.Order = SortOrder.Ascending; }
// Perform the sort with these new sort options. this.listView1.Sort(); ColumnClickEventArgs ea = new ColumnClickEventArgs(e.Column); this.listView2_ColumnClick(listView2, ea); }
private void listView2_ColumnClick(object sender, ColumnClickEventArgs e) { // Determine if clicked column is already the column that is being sorted. if (e.Column == lvwColumnSorter.SortColumn) { // Reverse the current sort direction for this column. if (lvwColumnSorter.Order == SortOrder.Ascending) { lvwColumnSorter.Order = SortOrder.Descending; } else { lvwColumnSorter.Order = SortOrder.Ascending; } } else { // Set the column number that is to be sorted; default to ascending. lvwColumnSorter.SortColumn = e.Column; lvwColumnSorter.Order = SortOrder.Ascending; }
// Perform the sort with these new sort options. this.listView2.Sort(); } } /// <summary> /// This class is an implementation of the 'IComparer' interface. /// </summary> public class ListViewColumnSorter : IComparer { /// <summary> /// Specifies the column to be sorted /// </summary> private int ColumnToSort; /// <summary> /// Specifies the order in which to sort (i.e. 'Ascending'). /// </summary> private SortOrder OrderOfSort; /// <summary> /// Case insensitive comparer object /// </summary> private CaseInsensitiveComparer ObjectCompare;
/// <summary> /// Class constructor. Initializes various elements /// </summary> public ListViewColumnSorter() { // Initialize the column to '0' ColumnToSort = 0;
// Initialize the sort order to 'none' OrderOfSort = SortOrder.None;
// Initialize the CaseInsensitiveComparer object ObjectCompare = new CaseInsensitiveComparer(); }
/// <summary> /// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison. /// </summary> /// <param name="x">First object to be compared</param> /// <param name="y">Second object to be compared</param> /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns> public int Compare(object x, object y) { int compareResult; ListViewItem listviewX, listviewY;
// Cast the objects to be compared to ListViewItem objects listviewX = (ListViewItem)x; listviewY = (ListViewItem)y;
// Compare the two items compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// Calculate correct return value based on object comparison if (OrderOfSort == SortOrder.Ascending) { // Ascending sort is selected, return normal result of compare operation return compareResult; } else if (OrderOfSort == SortOrder.Descending) { // Descending sort is selected, return negative result of compare operation return (-compareResult); } else { // Return '0' to indicate they are equal return 0; } }
/// <summary> /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0'). /// </summary> public int SortColumn { set { ColumnToSort = value; } get { return ColumnToSort; } }
/// <summary> /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending'). /// </summary> public SortOrder Order { set { OrderOfSort = value; } get { return OrderOfSort; } }
}
}
|
Присоединённый файл ( Кол-во скачиваний: 6 )
listViewTestDrive.7z 6,75 Kb
|