Avatar billede lasserasch Juniormester
29. december 2006 - 14:15 Der er 8 kommentarer og
1 løsning

Load af form halter hvis man laver SQL forespørgelse samtidig med

Hejsa.

Nogle gange har jeg tænkt over, om det kan lade sig gøre at få loaded hele sin form først, inden en SQL forespørgelse udføres.

F.eks. i det program jeg er ved at lave pt, ligger der DataGridViews på nogle forms, hvor der skal placeres mellem 500 - 20.000 records når formen loades.

Det tager omkring 10 - 20 sek at udføre disse SQL forespørgelser, og det ser vildt grimt ud når formen i disse sekunder kun er loaded halvt.

Så kan det enten lade sig gøre at loade en form færdig før den kører de funktioner den skal ved form_onload ect? eller kan man lave noget smart som f.eks. en flot form af en slags, der loades som det første, hvor der grafisk fortælles om status, og hvad den er i gang med at loade.


F.eks. et eller andet, som kunne fortælle hvor mange records den havde loaded ind nu osv...


Nogle gode forslag?


/Lasse
Avatar billede Syska Mester
29. december 2006 - 18:50 #1
på dit GridView

gw.BeginUpdate();
// insert data
gw.EndUpdate();

Det ville kunne hjælpe ... eller skal du køre det i en Thread ... som henter data og derefter binder det ....

// ouT
Avatar billede lasserasch Juniormester
30. december 2006 - 03:28 #2
Jepp....

Jeg løste det ved at lægge mine data ind i et dataset ved opstart af mit program.
Det er en stor mængde data, som kun opdateres 2 gange om ugen, så må brugeren genstarte sit program for at få evt. nye data med ind i programmet.

Jeg tror dog jeg skal sætte mig ned og lære lidt omkring threads, for det er sikkert ikke sidste gang jeg støder ind i dette problem!

Men jeg tænker også om der findes en eventhandler til noget ala : formloadcomplete eller noget i den stil.

Kan se at man kan fyre et event af når en form er closed. Er det bare mig som ikke kan finde eventet til når en form er loaded fuldt ud? Eller findes der virkelig ikke noget event til det?

/Lasse
Avatar billede dr_chaos Nybegynder
30. december 2006 - 15:20 #3
Jeg synes du burde kigge på background worker i samarbejde med progressbar.
Et lille eksempel
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using HelpDeskTool.Class;
namespace HelpDeskTool
{
    public partial class Splash : Form
    {
        private SubjectsList s = new SubjectsList();
        private HelpDeskForm MainForm;

        int AntalPoster = Hent evt et count fra databasen.
        public Splash(HelpDeskForm mainForm)
        {
            this.MainForm = mainForm;
            InitializeComponent();
            this.progressBar1.Maximum = AntalPoster;
            InitializeBgWorker();
                     
        }

     
        private void InitializeBgWorker()
        {
            this.bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
            this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            //start indlæsningen;
            this.bgWorker.RunWorkerAsync();
        }

        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
       
            BackgroundWorker bgw = sender as BackgroundWorker;
//her kalder du den metode som står for at loade datafra databasen.       
//s.LoadSubjects(bgw);
            //Class.Subjects.Loadsubjects(bgw, MainForm.SubjectsBindingSource);
        }

        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
//på complete af load binder du data til dit datagridview
            //MainForm.SubjectsBindingSource.DataSource = s;
            this.Dispose();
        }

        void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
//sørger for at opdaterer din progressbar og et label
            lblResult.Text = e.ProgressPercentage + " af " + AntalPoster + " poster indlæst";
            this.progressBar1.Value = e.ProgressPercentage;
        }
    }
   

}
Avatar billede dr_chaos Nybegynder
30. december 2006 - 15:22 #4
Her den metode jeg bruger til at loade data med:
  public static void Loadsubjects(DataTable subjectsData, BackgroundWorker bgw, BindingSource bs)
        {
            for (int i = 0; i < subjectsData.Rows.Count; i++)
            {
                DataRow productData = subjectsData.Rows[i];
                Subjects sub = new Subjects(productData);
                bs.Add(sub);
                bgw.ReportProgress(i);
//for at opdateringen af form ikke skal gå helt i stå.
                System.Threading.Thread.Sleep(1);
            }
        }
Avatar billede dr_chaos Nybegynder
30. december 2006 - 15:26 #5
Avatar billede lasserasch Juniormester
30. december 2006 - 17:40 #6
Ok, smid et svar. tak for hjælpen!

/Lasse
Avatar billede dr_chaos Nybegynder
30. december 2006 - 17:46 #7
svar :)
Np.
Avatar billede lasserasch Juniormester
30. december 2006 - 17:50 #8
Øhhh.... Du glemte vist at markere svar! Du har givet en kommentar!

/Lasse
Avatar billede dr_chaos Nybegynder
30. december 2006 - 17:52 #9
I den grad.
Det er ikke første gang :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester