změna vlastností Form2 z Form3   zodpovězená otázka

VB.NET, WinForms, .NET

Dobrý den, rád bych požádal o radu.

Mám otevřený nový Form2, potom otevřu Form3 (Showdialog) a z něho změním některé vlastnosti Form2. Problém je, že se změna vlastností neprojeví. Zkoušel jsem i z Form3 (při zavírání) volat proceduru Update_Form2, která je ve třídě Form2, ale stále nic. Jakmile se uzavře Form3, změna vlastností je samozř. přístupná.

Předem děkuji za event.radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A jakou změnu konkrétně provádíte? Možná sem hoďte kousek kódu. Já jsem to zkoušel tak, že jsem si na první formulář umístil prázdný label,z druhého formuláře jsem měnil jeho vlastnost text a změna se mi projevila okamžitě. Možná zkuste na konec procedury kterou provádíte změnu dát Form2.Refresh

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám formulář s řadou textboxů, radiobuttonů, checkbuttonů atd. a měním například jejich stav nebo přístupnost.

Z Form2 otevřu Form3. Když zkusím např. ve Form3 toto tak mi to nefunguje.

Private Sub CheckBox1_CheckedChanged(Byval sender as System.Object, Byval e as System.EventArgs) Handles CheckBox1.CheckedChanged

If CheckBox1.Checked = True then
Form2.GroupBox1.Enabled=False
Else
Form2.GroupBox1.Enabled=True
End if

End Sub

Jinak jsem chtěl používat trochu jiný postup a to tak, že ve Form3 se nastavují vlastnosti prvků z Form2, toto nastavení před uzavřením Form3 uložím a pak jsem chtěl (po uzavření Form3)vyvolat aktualizaci Form2 načtením hodnot z uloženého nastavení. Vše již mám ošetřeno procedurami, jen nedojde k aktualizaci Form2, takže hledám způsob jak na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý deň.

Skúšal som presne ten príklad, ktorý ste uviedol a všetko funguje okamžite tak, ako má. Ste si istý, že komponenty v groupboxe sú naozaj v ňom? Keď v návrhu meníte pozíciu groupboxu na formulári, mení sa aj pozícia komponentov v groupboxe? Alebo nemáte niekde v kóde zakázaný form2 (form2.enabled nastavené na false)? Lebo inak neviem, kde by mohla byť chyba. Mne to funguje bezproblémovo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak jsem psal ve svém dotazu, Form2 je nový

tedy:

Dim frm as New Form2
frm.Show()

a problém v mém případě evidentně spočívá v nedostatečném pochopení jak přistupovat k vlastnostem formuláře, který je vytvořen jako nová instance Form2, protože jakmile je to New Form2 tak to nefunguje. Něco podobného bylo již zmíněno zde: http://www.vbnet.cz/forum-tema--497-pred..., nicméně mi z toho bohužel není jasné jak se dostat k vlastnostem nového Form2

:-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve VB.NET 8.0 jde s formulářem pracovat stejně jako ve VB 6.0 - bez nutnosti vytvářet instanci konkrétního formuláře. Instanci konkrétního formuláře lze samozřejmě vytvořit také a tento způsob bych doporučoval, protože je nad tím potom větší kontrola. Každopádně si zvolte jeden ze způsobů a s tím potom pracujte na všech místech stejně.

Pozor:

Dim f2 As New Form2
f2.Text = "f2"
f2.Show()

Form2.Text = "Form2"
Form2.Show()

f2 a Form2 jsou RŮZNÉ instance třídy Form2!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslím, že je mi jasné, že f2 a Form2 jsou různé instance třídy Form2. Protože mohu mít současně otevřeno více Form2 a každý má být svojím účelem vlastně novým Form2, používám new Form2.

Nicméně jsem se stále nedopátral jak přistupovat z jiné třídy k vlastnostem nové instance Form2.

Omlouvám se jestli jsem trochu "natvrdlej" :-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No budete k ní přistupovat přes její instanční proměnnou, v mém příkladu f2. Viditelnost této proměnné záleží na tom kde a jak ji máte nadeklarovanou a přístup k členům třídy Form2 závisí na modifikátorech přístupu těchto členů. Ve výchozím stavu jsou ovládací prvky přidávány jako Friend, tj. jsou přístupné v rámci celé Assembly.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přidávám ještě příklad:

z Form1 (což je v mém případě MDI) otevřu new Form2

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New Form2
        frm.Show()
    End Sub
End Class

z Form2 otevřu Form3 jako dialog

Public Class Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form3.ShowDialog()
    End Sub
End Class

a ve Form3 provádím nastavení Form2

Public Class Form3
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            Form2.GroupBox1.Enabled = False
        Else
            Form2.GroupBox1.Enabled = True
        End If
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Sám som sa teraz zamotal.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitým řešením je toto:

Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form3.ShowDialog()
        Me.GroupBox1.Enabled = Form3.CheckBox1.Checked
    End Sub

End Class

tedy po uzavření Form3 jako dialogu se provede změna nastavení. Nicméně by mě zajímalo jestli je i jiná možnost řešení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

řešení je v celku snadné. Při volání Form3 si do něj uložíme referenci na Form2, uděláme to tak, že pozměníme konstruktor.Form3:

Private cnt As Form2

Public Sub New(ByRef container As Form2)
    InitializeComponent() 'je nutné pro provedení inicializace, neměnit
    cnt = container
End Sub

potom lze ve Form3 vždy zavolat cnt, které bude odkazovat na Form2. Ve Form2 nyní stačí jen upravit otevírání Form3:

    Dim dlg As New Form3(Me)
    '...
    dlg.ShowDialog()

to by snat mohlo fungovat... :)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback