A
Andrus
I have DataGridView in virtual mode containing 3500 rows.
In code below, assigning to RowCount value to 3500 takes 8 seconds.
CPU usage goes high at this time.
Stepping by F11 into user code shows few celltemplate property getters and
combobox/datecombo constructor calls without database access which does not
take a lot of time.
Debug output (below) shows lot of messages Stepping over non-user code.
Running in release mode from Windows this line speed is same (slow).
How to speed up grid creation ?
Using C# Express 2008 3.5 SP1 in Vista.
Andrus.
class Grid : System.Windows.Forms.DataGridView {
internal void SetDataRetriever(DataRetriever<TEntity> dataRetriever)
{ ......
SuspendLayout();
Enabled = false;
int cnt = DataRetriever.RowCount + (ReadOnly ? 0 : 1);
// next line takes 8 seconds:
RowCount = cnt;
Enabled = true;
ResumeLayout();
}
protected override void
OnCellValueNeeded(DataGridViewCellValueEventArgs e)
{
if (!Enabled)
return;
...
}
protected override void OnRowEnter(DataGridViewCellEventArgs e)
{
if (!Enabled)
return;
...
}
}
Debug output window contains:
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.RowCount.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.RowTemplateClone.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.Add'
Step into: Stepping over non-user code
'System.Windows.Forms.Control.Enabled.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.OnRowEnter'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetCurrentCellAddressCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetAndSelectCurrentCellAddress'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.this[int].get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetSelectedCellCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetSelectedElementCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.ClearSelection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetAndSelectCurrentCellAddress'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.OnRowCollectionChanged_PostNotification'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.InsertCopiesPrivate'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.Add'
In code below, assigning to RowCount value to 3500 takes 8 seconds.
CPU usage goes high at this time.
Stepping by F11 into user code shows few celltemplate property getters and
combobox/datecombo constructor calls without database access which does not
take a lot of time.
Debug output (below) shows lot of messages Stepping over non-user code.
Running in release mode from Windows this line speed is same (slow).
How to speed up grid creation ?
Using C# Express 2008 3.5 SP1 in Vista.
Andrus.
class Grid : System.Windows.Forms.DataGridView {
internal void SetDataRetriever(DataRetriever<TEntity> dataRetriever)
{ ......
SuspendLayout();
Enabled = false;
int cnt = DataRetriever.RowCount + (ReadOnly ? 0 : 1);
// next line takes 8 seconds:
RowCount = cnt;
Enabled = true;
ResumeLayout();
}
protected override void
OnCellValueNeeded(DataGridViewCellValueEventArgs e)
{
if (!Enabled)
return;
...
}
protected override void OnRowEnter(DataGridViewCellEventArgs e)
{
if (!Enabled)
return;
...
}
}
Debug output window contains:
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.RowCount.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewColumn.CellTemplate.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.CompleteCellsCollection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.RowTemplateClone.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.Add'
Step into: Stepping over non-user code
'System.Windows.Forms.Control.Enabled.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.OnRowEnter'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetCurrentCellAddressCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetAndSelectCurrentCellAddress'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.DataGridViewTextBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.PropertyStore.GetObject'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewCell.Style.get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewTextBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DataGridViewComboBoxCell'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.FlatStyle.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.DisplayStyleForCurrentCellOnly.set'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewComboBoxCell.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.CloneCells'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRow.Clone'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.this[int].get'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetSelectedCellCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetSelectedElementCore'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.ClearSelection'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.SetAndSelectCurrentCellAddress'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridView.OnRowCollectionChanged_PostNotification'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.InsertCopiesPrivate'
Step into: Stepping over non-user code
'System.Windows.Forms.DataGridViewRowCollection.Add'