Salve a tutti e grazie a chi potrà darmi una mano.
in Vindows Form c# ho una Form che contiene :
1 combobox
1 button
10 textbox
1 datagridview
Rilevo un problema di visualizzazione del contenuto della datagridview. Risulta particolarmente lento sia nella visualizzazione del contenuto delle celle, nella paginazione che spostare semplicemente il cursore di cella in cella o scorrere le righe.
N.B. Nell'angolo in alto a destra si attiva e disattiva la form (il tasto Rosso di chiusura Form passa dallo stato disable a enabled), il tempo che intercorre, circa 2 secondi, è il tempo necessario per reperire i dati, creare il dataTable e con il binding popolare il source della datagridview. Pertanto deduco che possa essere solo una questione di grafica dato il numero elevato di colonne.
Mentre i dati estratti provengono dalla lettura di una stored procedure e il ciclo while legge circa 700.000 records, esegue i calcoli, li distrinuisce statisticamente all'interno di un array multi dimensione (67 dimensioni).
A fine ciclo while l'array viene riordinato per come dovrà essere caricato nella datagridview.
Alla fine di questo processo l'array viene enumerato con un ciclo for per aggiungere le righe nel DataTable, ecc…ecc…
La datagridview al massimo può avere 3 pagine
Minimo può contenere 80 righe e al massimo circa 200 righe
Contiene 67 colonne, tutte formattate con lo stesso stile di font e tutte di tipo numerico di due cifre tranne una che contiene al massimo 3 cifre numeriche. Esempio:
La datagridview è solo di lettura
- non è permesso le aggiunte, eliminazioni e aggiornamento delle celle
- non è permesso l'ordinamento delle colonne
- non è permesso il ridimensionamento delle righe e delle colonne
- non è configurata la riga alternativa
- non è consentito la selezione multi linea o colonna
- non esistono Eventi di nessun tipo (essendo si solo lettura non si deve far scaturire nessun evento)
Le dimensioni:
- le dimensioni delle celle sono tutte fisse (noset)
- le dimensioni della datagridview è fissa
- le dimensioni della form è fissa e si può solo ridurre ad icona (non è consentito il max size)
Load datagridview:
- la datagridview viene popolata interamente da codice, dove viene creato un dataTable con le 67 colonne di tipo int.
- in circa 2 secondi avviene l'estrazione dei dati, il popolamento del dataTable, del bindingsource e il source della datagridview. Quindi un processo molto veloce e apprezzabile vista la fonte da cui si attinge che è abbastanza vasta.
- non vengono applicati filtri alla datagridview
- non viene applicato nessun tipo di ordinamento alla datagridview
Questo è la parte del codice che popola la datagridview:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace MyLotto65
{
public partial class FormTabelloneRitardi : Form
{
// set bindingsource tabellone and datatable
private BindingSource bindingSourceTabellone;
private DataTable dataTableTabellone;
// FORM INITIALIZE
public FormTabelloneRitardi()
{
InitializeComponent();
}
// FORM LOAD
private void FormTabelloneRitardi_Load(object sender, EventArgs e)
{
// create datatable tabellone for datagridview
MyCreateDataTableColumns();
// load datagridview
MyDatagridviewCreateLoad();
}
// DATAGRIDVIEW LOAD
private void MyDatagridviewCreateLoad()
{
// set wait cursor
Cursor.Current = Cursors.WaitCursor;
// clear datagridview
this.DgvTab.DataSource = string.Empty;
// set date parameter - ricerca estrazioni alla data selezionata
DateTime ExtractDate = Convert.ToDateTime(this.ComboBoxDateSearch.Text);
// create statistica tabellone ritardi
int[,] aryTabellone = ClassUtilityLotto.MyTabelleneRitardiRl(ExtractDate);
// clear datatable
dataTableTabellone.Clear();
// load rows in the datatable
for (int i = 0; i < aryTabellone.GetLength(0); i++)
{
// create row
DataRow newRow = dataTableTabellone.NewRow();
// load column
for (int j = 0; j < aryTabellone.GetLength(1); j++)
{
// check if value = 0, set = empty
object cellValue = aryTabellone[i, j] == 0 ? DBNull.Value : (object)aryTabellone[i, j];
newRow[j] = cellValue;
}
// add new row
dataTableTabellone.Rows.Add(newRow);
}
// datatable rows empty delete
for (int i = dataTableTabellone.Rows.Count - 2; i >= 0; i--)
{
if (string.IsNullOrEmpty(dataTableTabellone.Rows[i]["Ritardo"].ToString())) { dataTableTabellone.Rows.RemoveAt(i); }
}
// load datagridview binding source
bindingSourceTabellone.DataSource = dataTableTabellone;
this.DgvTab.AutoGenerateColumns = false;
this.DgvTab.DataSource = bindingSourceTabellone;
// set wait cursor
Cursor.Current = Cursors.Default;
// set focus
this.DgvTab.Focus();
}
// DATAGRIDVIEW CREATE DATATABLE COLUMN
private void MyCreateDataTableColumns()
{
// create new datatable e bindingsource
dataTableTabellone = new DataTable();
bindingSourceTabellone = new BindingSource();
// add columns in the datatable
dataTableTabellone.Columns.Add("Ritardo", typeof(int));
dataTableTabellone.Columns.Add("Ba1", typeof(int));
dataTableTabellone.Columns.Add("Ba2", typeof(int));
dataTableTabellone.Columns.Add("Ba3", typeof(int));
dataTableTabellone.Columns.Add("Ba4", typeof(int));
dataTableTabellone.Columns.Add("Ba5", typeof(int));
dataTableTabellone.Columns.Add("BaRl", typeof(int));
dataTableTabellone.Columns.Add("Ca1", typeof(int));
dataTableTabellone.Columns.Add("Ca2", typeof(int));
dataTableTabellone.Columns.Add("Ca3", typeof(int));
dataTableTabellone.Columns.Add("Ca4", typeof(int));
dataTableTabellone.Columns.Add("Ca5", typeof(int));
dataTableTabellone.Columns.Add("CaRl", typeof(int));
dataTableTabellone.Columns.Add("Fi1", typeof(int));
dataTableTabellone.Columns.Add("Fi2", typeof(int));
dataTableTabellone.Columns.Add("Fi3", typeof(int));
dataTableTabellone.Columns.Add("Fi4", typeof(int));
dataTableTabellone.Columns.Add("Fi5", typeof(int));
dataTableTabellone.Columns.Add("FiRl", typeof(int));
dataTableTabellone.Columns.Add("Ge1", typeof(int));
dataTableTabellone.Columns.Add("Ge2", typeof(int));
dataTableTabellone.Columns.Add("Ge3", typeof(int));
dataTableTabellone.Columns.Add("Ge4", typeof(int));
dataTableTabellone.Columns.Add("Ge5", typeof(int));
dataTableTabellone.Columns.Add("GeRl", typeof(int));
dataTableTabellone.Columns.Add("Mi1", typeof(int));
dataTableTabellone.Columns.Add("Mi2", typeof(int));
dataTableTabellone.Columns.Add("Mi3", typeof(int));
dataTableTabellone.Columns.Add("Mi4", typeof(int));
dataTableTabellone.Columns.Add("Mi5", typeof(int));
dataTableTabellone.Columns.Add("MiRl", typeof(int));
dataTableTabellone.Columns.Add("Na1", typeof(int));
dataTableTabellone.Columns.Add("Na2", typeof(int));
dataTableTabellone.Columns.Add("Na3", typeof(int));
dataTableTabellone.Columns.Add("Na4", typeof(int));
dataTableTabellone.Columns.Add("Na5", typeof(int));
dataTableTabellone.Columns.Add("NaRl", typeof(int));
dataTableTabellone.Columns.Add("Pa1", typeof(int));
dataTableTabellone.Columns.Add("Pa2", typeof(int));
dataTableTabellone.Columns.Add("Pa3", typeof(int));
dataTableTabellone.Columns.Add("Pa4", typeof(int));
dataTableTabellone.Columns.Add("Pa5", typeof(int));
dataTableTabellone.Columns.Add("PaRl", typeof(int));
dataTableTabellone.Columns.Add("Rm1", typeof(int));
dataTableTabellone.Columns.Add("Rm2", typeof(int));
dataTableTabellone.Columns.Add("Rm3", typeof(int));
dataTableTabellone.Columns.Add("Rm4", typeof(int));
dataTableTabellone.Columns.Add("Rm5", typeof(int));
dataTableTabellone.Columns.Add("RmRl", typeof(int));
dataTableTabellone.Columns.Add("To1", typeof(int));
dataTableTabellone.Columns.Add("To2", typeof(int));
dataTableTabellone.Columns.Add("To3", typeof(int));
dataTableTabellone.Columns.Add("To4", typeof(int));
dataTableTabellone.Columns.Add("To5", typeof(int));
dataTableTabellone.Columns.Add("ToRl", typeof(int));
dataTableTabellone.Columns.Add("Ve1", typeof(int));
dataTableTabellone.Columns.Add("Ve2", typeof(int));
dataTableTabellone.Columns.Add("Ve3", typeof(int));
dataTableTabellone.Columns.Add("Ve4", typeof(int));
dataTableTabellone.Columns.Add("Ve5", typeof(int));
dataTableTabellone.Columns.Add("VeRl", typeof(int));
dataTableTabellone.Columns.Add("Nz1", typeof(int));
dataTableTabellone.Columns.Add("Nz2", typeof(int));
dataTableTabellone.Columns.Add("Nz3", typeof(int));
dataTableTabellone.Columns.Add("Nz4", typeof(int));
dataTableTabellone.Columns.Add("Nz5", typeof(int));
dataTableTabellone.Columns.Add("NzRl", typeof(int));
}
}
}
In pratica ho disattivato tutte le proprietà che ritengo non siano utili allo scopo come da immagine :
Secondo voi è possibile migliorare le prestazioni di visualizzazione della datagridview ?
Grazie.