Well, the line that you displayed should do that. Can you show some
code/example of where it doesn't? A full example, of course.
Steps to reproduce:
1. Run code below
2. Double click in grid header in separation line between columns 1 ja 2
Observed:
CPU usage goes to 100% for a long time.
Andrus.
// modified virtual mode sample from Chris Sells book
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<DataObjectm_Data = new List<DataObject>();
private List<boolm_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(DataGridViewAutoSizeColum nsMode.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; }
}
}