Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

Aktivity (1)
Avatar
n5ver
Člen
Avatar
n5ver:14.1.2015 22:42

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:14.1.2015 22:56

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ý:14.1.2015 23:18

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:14.1.2015 23:23

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ý:14.1.2015 23:27

Ukaž mi tu metodu reload.

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

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:14.1.2015 23:48

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ý:15.1.2015 0:11

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:15.1.2015 6:44

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.