2012-05-06 4 views
0

Je souhaite exécuter un worker de fond pour mettre à jour une listbox avec des valeurs provenant d'une base de données mssql. Je suis sorti avec ceci:Mise à jour automatique C# listbox

public frmMain()  { 
     InitializeComponent();    
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    } 

    private void frmMain_Load(object sender, EventArgs e) { 
      if (bw.IsBusy != true) 
      { 
       bw.RunWorkerAsync(); 
      } 
    } 

    private void bw_DoWork(object sender, DoWorkEventArgs e){ 
     BackgroundWorker worker = sender as BackgroundWorker; 
     for (int i = 1; (i <= 10); i++) { 
      if ((worker.CancellationPending == true)) { 
       e.Cancel = true; 
       break; 
      } 
      else    { 
       (1) LoadPrescriptions(); //load the date in a list and writes the list into the listbox 
       (2) System.Threading.Thread.Sleep(500); 
      } 
     } 
    } 


    private void LoadPrescriptions() 
    { 
     main_controller = new MainController(); 
     prescriptionsList = new List<Prescription>(); 
     prescriptionsList = main_controller.LoadPrescriptions(0); 
     lstPrescriptions.Items.Clear(); 
     for (int i = 0; i < prescriptionsList.Count; i++) 
      lstPrescriptions.Items.Add(prescriptionsList[i].name + " " + prescriptionsList[i].surname); 
    } 

Quelque part entre (1) et (2) je reçois une erreur A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll .

Des idées pour résoudre ce problème? Je veux juste lancer une mise à jour de la listbox aussi longtemps que le programme est en cours d'exécution.

+0

Ne pas accéder à l'élément d'interface utilisateur graphique et débogage pour voir si vous obtenez toujours l'exception dans LoadPrescriptions – Adil

+0

quoi? S'il vous plaît expliquer mieux parce que je n'ai pas compris. J'ai commenté le "pour" dans LoadPrescription mais j'ai toujours l'erreur. –

+0

Je veux dire, avez-vous accès à certains contrôles Windows comme combo dans la méthode LoadPrescriptions? – Adil

Répondre

2

Lorsque nous avons accès à un certain contrôle de l'interface de fil autre que l'interface graphique entrer dans ce genre de situation

Essayez d'accéder à l'élément d'interface au sein de cette structure de délégué

 MethodInvoker objMethodInvoker = delegate 
     { 
      //access and assign data to list control here    
     }; 
     if (InvokeRequired) 
      BeginInvoke(objMethodInvoker); 
     else 
      objMethodInvoker.Invoke(); 
+0

la mise à jour fonctionne très bien. maintenant je dois faire face à un indice hors de l'exception de gamme. –

+0

Vérifiez si vous accédez à une collection comme tableau hors de sa taille comme l'accès au 4ème élément de tableau ayant la taille de trois éléments – Adil

+0

Je pense qu'il y avait une erreur dans le programme ou quelque chose, parce que je ne reçois plus cette erreur. Merci beaucoup 4 vos réponses. –

Questions connexes