DataGridView column autoresize hangs in virtual mode

A

Andrus

VSE 2005 .NET 2 WinForms

I have DataGridView in virtual mode containing huge number of rows.
When user double clicks in column separator line in grid header, application
hangs: grid tries to read all rows!

How to force DataGridView to resize column only by using visible lines in
screen ?

I tried
AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader);

but this did not help.

Andrus.
 
N

Nicholas Paldino [.NET/C# MVP]

Andrus,

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.
 
A

Andrus

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