using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public class SampleItem : ListViewItem { private int col1, col2, col3; public int Col1 { get { return col1; } } public int Col2 { get { return col2; } } public int Col3 { get { return col3; } } public SampleItem(int col1, int col2, int col3) { this.col1 = col1; this.col2 = col2; this.col3 = col3; base.Text = col1.ToString(); base.SubItems.Add(col2.ToString()); base.SubItems.Add(col3.ToString()); } } public class SampleSorter : IComparer { private int column = 0; public SampleSorter(int column) { Column = column; } public int Column { get { return column; } set { if (column < 0 || column > 2) { throw new ArgumentOutOfRangeException(); } column = value; } } public int Compare(SampleItem x, SampleItem y) { if (x != null && y != null) { switch (Column) { case 0: return x.Col1.CompareTo(y.Col1); case 1: return x.Col2.CompareTo(y.Col2); case 2: return x.Col3.CompareTo(y.Col3); } } return 0; } } List list; void Form1_Load(object sender, EventArgs e) { listView1.Columns.Clear(); listView1.Columns.Add("Col1").TextAlign = HorizontalAlignment.Right; listView1.Columns.Add("Col2").TextAlign = HorizontalAlignment.Right; listView1.Columns.Add("Col3").TextAlign = HorizontalAlignment.Right; listView1.VirtualMode = false; listView1.Items.Clear(); listView1.View = View.Details; listView1.FullRowSelect = true; // 10万件のサンプルデータを作成しておく list = new List(); Random rnd = new Random(); for (int i = 1; i <= 100000; i++) { list.Add(new SampleItem( rnd.Next(999999), rnd.Next(999999), rnd.Next(999999))); } } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("仮想ListViewに表示"); listView1.VirtualListSize = list.Count; listView1.VirtualMode = true; } private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) { if (0 <= e.ItemIndex && e.ItemIndex < list.Count) { System.Diagnostics.Trace.WriteLine(e.ItemIndex); e.Item = list[e.ItemIndex]; } } private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) { MessageBox.Show(String.Format("ソート列:{0}", e.Column)); list.Sort(new SampleSorter(e.Column)); int start = listView1.TopItem.Index; listView1.RedrawItems(start, start + 30, true); MessageBox.Show("ソート完了"); } } }