c# Tworzenie nowego okna formularza

0

Królestwo dla tego kto mi wyjaśni różnicę między tym wywołanie metody:


                    if (!listaRozmowcow.Contains(wiadomosc.nadawca))
                        TworzNoweokno(wiadomosc.nadawca);
                   

a tym:

private void f_lb_uzytkownicy_DoubleClick(object sender, EventArgs e)
        {
            if (f_lb_uzytkownicy.SelectedItem != null && f_lb_uzytkownicy.SelectedItem!="")
            {
                TworzNoweokno(f_lb_uzytkownicy.SelectedItem.ToString());
            }
        }

a to wywoływana metoda:

private void TworzNoweokno(string odbiorca)
        {
            noweOkno = new f_f_oknorozmowy(odbiorca);
            noweOkno.Parent = this.Parent;
            noweOkno.Show();
        }

Wyjaśnię że wiadomosc. nadawca to na pewno string i nie chodzi mi o to że jedna jest wyzwalana zdarzeniem a druga programowa. Okien otwieranych drugim sposobem mogę mieć mnóstwo i jest ok a gdy robię to w programie dostaję taki błąd:
ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment. W tworzonej formie mam kontrolkę WebBrowser i to ona powoduje błąd, ale dlaczego raz jest ok a raz nie?
O co chodzi??

0

Dobra, wiem co jest nie tak. Chciałem wywołać metodę programowo z innego wątku, wiem że takie sytuacje rozwiązuje się w ten sposób:

private void TworzNoweokno(string odbiorca)
        {
            if (noweOkno.InvokeRequired)
            {
                SetTextCallBackHTML s = new SetTextCallBackHTML(TworzNoweokno);
                this.Invoke(s, new object[] { odbiorca });
            }
            else
            {
                noweOkno = new f_f_oknorozmowy(odbiorca);
                noweOkno.Parent = this.Parent;
                noweOkno.Show();
            }
        }

Tzn to akurat nie działa bo nie mogę sprawdzić InvokeRequired obiektu którego nie ma. Pewnie trzeba to sprawdzić w momencie tworzenia kontroli webbrowser w pliku designer.cs, tylko jak?

0

Mam nadzieję że znajdzie się jakiś specjalista od wątków, bo chyba tu leży problem. Potrzebuje czegoś co pozwoli mi wykonać metodę z innego wątku i zwrócić z niej wartość do tego wątku. Wątek który wywołał metodę musi czekać na jej zakończenie. I w zasadzie mam coś takiego z tym że znowu pojawia się tu problem InvokeRequired.

0

To rozwiązało mój problem.

this.Invoke((MethodInvoker)delegate() { TworzNoweokno(wiadomosc.nadawca); });

Jak teraz można sprawdzić czy nowy form został ukończony, bo wydaje mi się że za szybko chce coś do niego wpisać i przez to się nic nie wyświetla dopiero przy drugim podejściu jest ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1