29. december 2006 - 14:15Der 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...
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?
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(); }
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; } }
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); } }
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.