Avatar billede tobiha Nybegynder
12. januar 2010 - 13:11 Der er 5 kommentarer og
1 løsning

backgroundworker fylder i listbox

Hej jeg prøver at fylde en listbox med nogle ad-gruppenavne og det går fint, men når jeg debugger får jeg følgende fejl:
"Handling på tværs af tråde er ugyldig: Objektet 'group_listbox' blev åbnet fra en anden tråd end den tråd, det blev oprettet i."

Nogen der kan hjælpe?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;
using System.Threading;

namespace xxxxxxx
{
    public partial class Priviliges : Form
    {
        BackgroundWorker bw = new BackgroundWorker();
        string selectedGroup;

        public Priviliges()
        {
            InitializeComponent();
            group_listbox.Sorted = true;
            bw.DoWork += fillGroup;
            bw.RunWorkerCompleted += fillGroupDone;
            bw.RunWorkerAsync();
        }

        private void fillGroup(object sender, DoWorkEventArgs e)
        {     
            DirectoryEntry entry = new DirectoryEntry(Properties.Settings.Default.Server, Program.loggedinUser.Username, Program.loggedinUser.Password);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);
            mySearcher.Filter = ("(objectClass=Group)");
            foreach (SearchResult resEnt in mySearcher.FindAll())
            {
                DirectoryEntry de = resEnt.GetDirectoryEntry();
                group_listbox.Items.Add(de.Properties["CN"].Value.ToString());               
                Thread.Sleep(10);               
            }
        }
        private void fillGroupDone(object sender, RunWorkerCompletedEventArgs e)
        {
            grp_lb.Text = "GROUPS      Update done!";
        }

        private void fillUserDone(object sender, RunWorkerCompletedEventArgs e)
        {
            usr_lb.Text = "USERS      Update done!";
        }
}
Avatar billede tobiha Nybegynder
12. januar 2010 - 13:19 #1
fejlen kommer på denne linje:

    group_listbox.Items.Add(de.Properties["CN"].Value.ToString());
Avatar billede Syska Mester
12. januar 2010 - 13:19 #2
Cross thread violation not allowed ... google giver mange hits på det og problemer har også været på eksperten mange gange.

http://allantech.blogspot.com/2007/06/making-cross-thread-calls-events.html

Problemet at at du fra en tråd ikke må skrive til en anden tråds UserControls.

mvh
Avatar billede Syska Mester
12. januar 2010 - 13:21 #3
http://www.eksperten.dk/spm/847583

Her er mere info om det
Avatar billede tobiha Nybegynder
12. januar 2010 - 13:28 #4
har fikset det....

if (group_listbox.InvokeRequired)
{  group_listbox.Invoke((MethodInvoker)delegate({group_listbox.Items.Add(de.Properties["CN"].Value.ToString());});

}

men smid et svar som tak for hjælpen
Avatar billede Syska Mester
12. januar 2010 - 13:32 #5
svar
Avatar billede bvli Praktikant
12. januar 2010 - 15:02 #6
I stedet for at bruge invoke på kontrollen bør du nok bruge din backgroundworkers ReportProgress i stedet. Den er lavet til at du kan manipulere kontrollerne fra den, da den altid kører i din hovedtråd.

Se evt: http://www.eksperten.dk/spm/887906#reply_7460096
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