Diskuze: Úprava listBoxu ze stejného vlákna

C# .NET .NET (C# a Visual Basic) Úprava listBoxu ze stejného vlákna American English version English version

Avatar
n5ver
Člen
Avatar
n5ver:

Ahoj, ačkoliv v programu vůbec nijak nepracuji s vlákny, když chci listBox vyčistit pomocí Items.Clear() a naplnit pomocí Items.AddRange(_db­.VratVsechno) (vrací pouze stringové pole s názvy položek) dostávám tuto výjimku: Operace mezi vlákny není platná: Přístup k ovládacímu prvku listZaznamu proběhl z jiného vlákna než z vlákna, v rámci kterého byl vytvořen.

Naví prosím někdo co s tím?

 
Odpovědět 14.1.2015 22:42
Avatar
n5ver
Člen
Avatar
n5ver:

Tak jsem přišel na to, že to vyhazuje výjimku v EventHandleru timeru, který se aktivuje, po končení odpočtu.

 
Nahoru Odpovědět 14.1.2015 22:56
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na n5ver
Jan Vargovský:

Timer běží ve vlastním vlákně, takže musíš použít Invoke metodu.

 
Nahoru Odpovědět 14.1.2015 23:18
Avatar
n5ver
Člen
Avatar
n5ver:

Aha... Já s tím nemám zkušenosti. Prosím poradil by jsi mi jak to napsat? Potřebuji, aby se provedla metoda reload()

void casovac_Elapsed(object sender, ElapsedEventArgs e)
        {
            bool prazdno = _db.Seznam.Any();
            if(prazdno)
            {
                foreach (Zaznam zaz in _db.Seznam)
                {
                    _datum = DateTime.Now;
                    string datum1 = zaz.Datum.ToString("dd.MM.yyyy");
                    string datum2 = _datum.ToString("dd.MM.yyyy");
                    if (datum1 == datum2 && !zaz.Zobrazeno)
                    {
                        zaz.Zobrazeno = true;
                        MessageBox.Show(zaz.Nazev + " " + datum1, "Upozornění!");
                        reload();
                    }
                }
            }
        }
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 14.1.2015 23:23
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na n5ver
Jan Vargovský:

Ukaž mi tu metodu reload.

 
Nahoru Odpovědět 14.1.2015 23:27
Avatar
n5ver
Člen
Avatar
Odpovídá na Jan Vargovský
n5ver:

Je tam jen

listZaznamu.Items.Clear();
listZaznamu.Items.AddRange();
 
Nahoru Odpovědět 14.1.2015 23:41
Avatar
n5ver
Člen
Avatar
Odpovídá na n5ver
n5ver:

Na to řešení jsem klikl omylem. Jsem na mobilu...

 
Nahoru Odpovědět 14.1.2015 23:48
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na n5ver
Jan Vargovský:

to tvoje "jen" je to, co ti způsobuje tu vyjímku, protože saháš na ten listBox z jiného vlákna (z toho timerového).

Místo čistého reload zavolej tohle:

listZaznamu.Invoke((MethodInvoker)reload);

Tím řekneš z tvého timerového vlákna něco ve smyslu: hej, tu máš odkaz na mojí metodu a vykonej si jí u sebe, protože já k němu nemám přístup.

 
Nahoru Odpovědět  +2 15.1.2015 0:11
Avatar
n5ver
Člen
Avatar
n5ver:

Děkuji za pomoc.

 
Nahoru Odpovědět 15.1.2015 6:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.