DataGridView column autoresize hangs application

  • Thread starter Thread starter Andrus
  • Start date Start date
A

Andrus

I tried to use DisplayedCellsExceptHeader column resize mode in
DataGridView.
Clicking in column separator line causes application to stop responding.
Grid reads all rows for unknown reason.

How to implement column autorisize so that only displayed columns are used
for autoresize ?

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.

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; }
}
}
 
Back
Top