Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
DataGridView RowCount setting very slow
Message
De
29/10/2008 08:14:59
 
 
À
28/10/2008 16:07:23
Information générale
Forum:
ASP.NET
Catégorie:
Formulaires
Versions des environnements
Environment:
VB 9.0
OS:
Vista
Network:
Windows 2008 Server
Database:
MS SQL Server
Divers
Thread ID:
01357256
Message ID:
01357982
Vues:
26
This message has been marked as a message which has helped to the initial question of the thread.
>>Hmmm. Not sure about the extent of the improvement. Prior to my post I just did a quick test using your posted code (but swapping the two statements) and noticed an improvement. I've just added code to show timings and, on my machine, the delay dropped by about 50% (from 6 to 3 seconds) but there's still that 3 sec delay for the basic code......
>
>Yes, this sample does not eliminate delay.
>
>I tested with real application data (3400 rows, approx 30 columns, but number of combobox columns) and in this case this delay has gone.
>
>Number of columns affects to Rowcount setting speed exponentially, number of rows affects to speed linearily.
>
>I'm adding grid columns dynamically.
>
>Issue is that RowCount setting for newly instantiated grid seems to add single column to grid.
>My grid builder adds real columns and thus fake column appear as first grid first column.
>
>This issue may be related to another issue which is unresloved. How to fix this resize issue:
>
>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; }
>}
>}
>
One way to lose the delay (but you also lose the functionality) SNIP:
public VirtualModeForm()
        {
            Controls.Add(m_Grid);
            m_Grid.CellValueNeeded += OnCellValueNeeded;
            m_Grid.ColumnDividerDoubleClick += new DataGridViewColumnDividerDoubleClickEventHandler(m_Grid_ColumnDividerDoubleClick);
            System.Diagnostics.Debugger.Break();
            InitData();
            InitGrid();
        }

        void m_Grid_ColumnDividerDoubleClick(object sender, DataGridViewColumnDividerDoubleClickEventArgs e)
        {
            e.Handled = true;
        }
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform