DataGridView column autoresize hangs application

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top