Progressbar per il caricamento dei dati per DataGridView utilizzando DataTable

Ho un DataGridView in cui caricare i dati da un database di SQL server. Quando carico i dati che richiede molto tempo.

Vorrei dare informazioni all’utente che i dati di carico. Posso chiedere qual è il modo migliore di collegare Progressbar quando i dati sono caricamento in DataGridView?

Non voglio che nessuno di codice di lavoro per me. Vorrei sapere come si può fare.

Vedo qualcuno premiato la mia domanda bounty. Vorrei dire che al momento Iam utilizzando questo codice che vorrei considerare se si adatti.

DTGdataTable = new DataTable();
SqlDataAdapter SDA = new SqlDataAdapter
SDA.Fill(DTGdataTable);
dataGridView1.DataSource = DTGdataTable ;

Grazie a tutti per il vostro tempo.

InformationsquelleAutor Marek | 2013-08-22

 

5 Replies
  1. 20

    Se il problema è che ci vuole tempo per recuperare i dati dal database, ho una possibile soluzione per voi:

        private void buttonLoad_Click(object sender, EventArgs e)
        {
            progressBar.Visible = true;
            progressBar.Style = ProgressBarStyle.Marquee;
            System.Threading.Thread thread = 
              new System.Threading.Thread(new System.Threading.ThreadStart(loadTable));
            thread.Start();
        }
    
        private void loadTable()
        {
            //Load your Table...
            DataTable table = new DataTable();
            SqlDataAdapter SDA = new SqlDataAdapter();
            SDA.Fill(table);
            setDataSource(table);
        }
    
        internal delegate void SetDataSourceDelegate(DataTable table);
        private void setDataSource(DataTable table)
        {
            //Invoke method if required:
            if (this.InvokeRequired)
            {
                this.Invoke(new SetDataSourceDelegate(setDataSource), table);
            }
            else
            {
                dataGridView.DataSource = table;
                progressBar.Visible = false;
            }
        }

    Mettere il metodo di caricamento dei dati in un altro thread e impostare l’origine dati quando è finito. Ci dovrebbe essere una invocare richiesto. Se si desidera visualizzare i valori in percentuale della progressbar, non utilizzare lo stile ‘Perimetro’ e aggiungere un’altra funzione e delegato che si può invocare per l’impostazione del valore della barra di avanzamento.

    Se il binding dei dati per la griglia è il problema, allora non è possibile mettere l’associazione in un altro thread e si può mostrare un progresso pop-up che viene eseguito in un altro thread.

    Spero che questo aiuta.

  2. 3

    Provare questo…Questo dovrebbe essere il percorso più veloce…

    1) Add a button control.
    2) Add a datagridview control.
    3) Add a single column into the datagridview control.
    4) Add a progressbar control.
    5) Leave them all with default names.

    Sotto l’evento button1_Click aggiungere questo pezzo di codice…

    int maxnumber = 1000;
    progressBar1.Value = 0;
    progressBar1.Maximum = maxnumber;
    for (int x = 0; x <= maxnumber - 1; x++)
    {
        Application.DoEvents();
        dataGridView1.Rows.Add(new string[] {Convert.ToString(x)});
        progressBar1.Value += 1;
        label1.Text = progressBar1.Value.ToString();
    }

    Che sia. Modifica per soddisfare le vostre esigenze. Questo non è il completo codice esatto che si desidera, ma si dovrebbe iniziare. Mi sono preso la libertà di dichiarare maxnumber per tenere il limite della progressbar. Nel tuo caso, questo dovrebbe essere il numero di riga del database ed è sottratto dal 1 indice parte sempre da zero 🙂

    Il metodo di cui sopra è un singolo thread, il che significa che non è ancora possibile fare multitasking, mentre il ciclo ancora non è fatto di sicurezza. In alcuni casi, a seconda dell’algoritmo di codice, usando il thread singolo metodo può essere più veloce di andare per il multithreading percorso. Comunque, il secondo metodo è l’utilizzo di un backgroundworker. Questo è più comunemente preferito da persone in quanto l’utente può ancora fare qualcosa, mentre l’elenco dei carichi. Un po ‘ come installatori, dove è possibile annullare l’installazione anche se è nel bel mezzo di fare qualcosa. Il sito web qui sotto dovrebbe iniziare. Il codice è in VB.NET ma possono essere facilmente convertiti in C# 🙂

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/efd7510c-43ed-47c4-86a3-1fa350eb0d30/fill-datagridview-using-backgroundworker-progressbar?forum=vbgeneral

    • Application.DoEvents? Non sarebbe un BackgroundWorker essere meglio di un consiglio?
    • Sì, hai ragione. Un backgroundworker è una scelta migliore dal momento dell’Applicazione.DoEvents è ancora single threaded. È il motivo per cui ho detto che il percorso più rapido, indipendentemente da quale dei due è migliore. Potrei fare un backgroundworker metodo di troppo, dopo che io ho la mia colazione 🙂 Grazie per la segnalazione fuori Sir 🙂
    • Apprezzo che hai postato questa risposta. Da quanto vedo posso collegarlo alla stringa[], in quel momento avrei potuto usare, ma ora Iam utilizzando SqlDataAdapter e caricamento in datagridview come ` SDA.Di riempimento(DataTable);` Sarà la tua soluzione funziona anche con il DataTable – dataGridView1.DataSource = DataTable;
    • Io non la penso così…ma potrei sbagliarmi. Ho avuto lo stesso problema e ho finito di fare quello che ho suggerito. Il controllo datagridview non riferire nulla. Il meglio che si possa fare è mostrare un “tendone” tipo di indicatore che indica all’utente qualcosa che è ancora al lavoro. Non ho trovato una documentazione su ciò che si desidera, ma può essere ancora possibile, basta ignorare un sacco di codice di default 🙂
  3. 2

    Il problema è tutto il carico di dati insieme e tornare dal database.
    È necessario per ottenere l’avanzamento del caricamento dei dati. Questo può essere fatto dal database.

    1. Ottenere il numero di righe di dati da database. (Questa query restituisce un singolo numero, quindi dovrebbe essere più veloce).

    2. Ottenere i dati in parti (Divisione & conquer strategia), è possibile utilizzare OFFSET e RECUPERARE le query di database. (Questo è restituire una parte di dati su ogni chiamata)
      OFFSET e FETCH è disponibile su diversi database. In MSSQL, è stato introdotto nella versione 2012.

    Quando stiamo ottenendo i dati in parti da server, siamo in grado di calcolare lo stato di avanzamento.

    • Anche per le vecchie versioni di database è possibile utilizzare la funzione ROW_NUMBER() per ottenere i risultati in parti.
  4. 2

    All’interno del codice, questa linea la maggior parte del tempo di elaborazione:

    SDA.Fill(DTGdataTable);

    Quindi penso che la cosa più importante è quello di tenere traccia dei progressi, mentre questo è in esecuzione. Per fare questo, è necessario prima sapere quante righe ci si aspetta. SQLDataAdapter non può fornire questa informazione, quindi si avrebbe bisogno di eseguire un CONTE(*) query prima di ottenere questo numero. È quindi possibile utilizzare questo come il Massimo sul tuo ProgressBar.

    Mio effettivo caricamento di codice è basato su Michael Hofmeiers soluzione, ma invece di usare la ProgressBar nel Perimetro di selezione modalità, vorrei alimentarlo con un reale progresso dati da un Controllo Timer. Quindi nel tuo modulo, è possibile aggiungere un Timer di controllo (denominato progressTimer nel mio esempio), impostare gli Intervalli di 100 msec e Enabled su false. Quindi il codice diventa:

    private DataTable table = null;
    
    private void buttonLoad_Click(object sender, EventArgs e)
    {
        //TODO: Select the row count here and assign it to progressBar.Maximum
    
        progressBar.Visible = true;             
        System.Threading.Thread thread = 
          new System.Threading.Thread(new System.Threading.ThreadStart(loadTable));
        thread.Start();
        progressTimer.Enabled = true;
    }
    
    private void loadTable()
    {
        //Load your Table...
        this.table = new DataTable();
        SqlDataAdapter SDA = new SqlDataAdapter();
        SDA.Fill(table);
        setDataSource(table);
    }
    
    internal delegate void SetDataSourceDelegate(DataTable table);
    private void setDataSource(DataTable table)
    {
        //Invoke method if required:
        if (this.InvokeRequired)
        {
            this.Invoke(new SetDataSourceDelegate(setDataSource), table);
        }
        else
        {
            progressTimer.Enabled = false;
            dataGridView.DataSource = table;
            progressBar.Visible = false;
        }
    }
    
    private void progressTimer_Tick(object sender, EventArgs e)
    {
        if (this.table != null)
            progressBar.Value = this.table.Rows.Count;
    }

    Quando si esegue questa operazione, l’applicazione resterà reattivo durante il caricamento, e vedrai che la ProgressBar cambiare per riflettere il numero di righe caricato. Solo alla fine (quando si imposta l’Origine dati sul DataGridView) l’applicazione sembra “bloccato”, ma io non credo che ci sia un modo per evitare che. È possibile eseguire questa operazione dal thread principale, quindi è inevitabile che l’interfaccia utente non risponde. Ma nel mio test, il DataGridView gestisce facilmente 300K+ righe in circa un secondo, in modo che non dovrebbe essere che molto di un problema.

  5. -4

    1.Scaricare ajax loader.gif da google.

    2.sostituire l’immagine con questo codice..

    3.Impostare il tempo di conseguenza..

    <div id="spinner" style="display: none;">
    <span id="ss" style="float: left; margin-left: 50% !Important; margin-top: 22% !Important;">
    <img src="ajax-pink-loader.gif" alt="Loading..." />
    </span>
    </div>
    
        $("#ssubmit").click(function () {
            $("#spinner").show();
            setInterval(function () {
                $("#spinner").hide();
            }, 20000);
        });
    • Le domande di tag windows form. IMHO, better DELETE the question. NON risposta utile.

Lascia un commento