2012-05-06 4 views
0

Я хочу запустить фоновый рабочий для обновления списка со значениями из базы данных mssql. Я вышел с этим:Auto update 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); 
    } 

Где-то между (1) и (2) я получаю A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll ошибку.

Идеи о том, как я могу исправить это? Я просто хочу запустить обновление списка до тех пор, пока программа работает.

+0

Не доступ к элементу GUI и отладки чтобы узнать, все ли исключение в LoadPrescriptions – Adil

+0

что? Пожалуйста, объясните лучше, потому что я не понял. Я прокомментировал «for» в LoadPrescription, но до сих пор получаю ошибку. –

+0

Я имею в виду, что вы получаете доступ к некоторым элементам управления Windows, например комбо в методе LoadPrescriptions? – Adil

ответ

2

Когда мы достигаем некоторый контроль GUI из другого потока, то GUI мы попадаем в такой ситуации

Попытка доступа к элементу графического интерфейса в пределах этого делегата структуры

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

обновление работает отлично. теперь мне приходится иметь дело с исключением индекса вне диапазона. –

+0

Убедитесь, что вы получаете доступ к какой-либо коллекции, такой как массив, из своего размера, например, к доступу к 4-му элементу массива, имеющему размер трех элементов. – Adil

+0

Я думаю, что в программе произошла ошибка или что-то еще, потому что я больше не получаю эту ошибку. большое спасибо вашим ответам. –