When the AutoSizeColumnsMode property of a DataGridView is set to
DisplayedCellsExceptHeader, the column widths adjust to fit the contents
of
all cells in the columns that are in rows currently displayed onscreen,
It is not so.
For unknown reason
DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader mode scans all
rows in grid.
So using this is not reasonable for large grids.
Aby idea how to fix this ?
Andrus.
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.
// 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<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; }
}
}