using System; >using System.Windows.Forms; >using System.Collections.Generic; > >class test { >[STAThreadAttribute()] >public static void Main() { >Application.Run(new VirtualModeForm()); >} >} > >class VirtualModeForm : Form { >private List<DataObject> m_Data = new List<DataObject>(); >private List<bool> m_Visited = new List<bool>(); >DataGridView m_Grid = new DataGridView(); >public VirtualModeForm() { >Controls.Add(m_Grid); >m_Grid.CellValueNeeded += OnCellValueNeeded; >InitData(); >InitGrid(); >} > >private void InitData() { >for (int i = 0; i < 1000001 + 1; i++) { >m_Visited.Add(false); >DataObject obj = new DataObject(); >obj.Id = i; >obj.Val = 2 * i; >m_Data.Add(obj); >} } > >private void InitGrid() { >m_Grid.Dock = DockStyle.Fill; >m_Grid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader); >m_Grid.VirtualMode = true; >m_Grid.ReadOnly = true; >m_Grid.ColumnCount = 3; >m_Grid.Rows.Add(); >m_Grid.Rows.AddCopies(0, 1000000); >} > >private void OnCellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { > >m_Visited[e.RowIndex] = true; >if (e.ColumnIndex == 0) { > e.Value = m_Data[e.RowIndex].Id; >} else if (e.ColumnIndex == 1) { > e.Value = m_Data[e.RowIndex].Val; > } else if (e.ColumnIndex == 2) { > >Random rand = new Random(); >e.Value = rand.Next(); >} >} >} > >public class DataObject { >private int m_Id; >private int m_Val; > >public int Val { >get { return m_Val; } >set { m_Val = value; } >} > >public int Id { >get { return m_Id; } >set { m_Id = value; } >} >} >One way to lose the delay (but you also lose the functionality) SNIP:
public VirtualModeForm() { Controls.Add(m_Grid); m_Grid.CellValueNeeded += OnCellValueNeeded; m_Grid.ColumnDividerDoubleClick += new DataGridViewColumnDividerDoubleClickEventHandler(m_Grid_ColumnDividerDoubleClick); System.Diagnostics.Debugger.Break(); InitData(); InitGrid(); } void m_Grid_ColumnDividerDoubleClick(object sender, DataGridViewColumnDividerDoubleClickEventArgs e) { e.Handled = true; }