Různé instance jednoho formuláře   zodpovězená otázka

VB.NET, WinForms

Dobrý večer,

snažím se vytvořit dvě různé instance formuláře(s různými vlastnostmi jejich komponent) a použít jednu z nich pro uchování původních hodnot pro případ stisknutí tlačítka storno. Níže uvedený kód však nefunguje. Chápu správně, že je to proto, že třída je referenční typ? Dá se to nějak obejít nebo na to jdu úplně špatně?

Ve třídě Form1 je:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'tlačítko otevři okno2
        If okno2 Is Nothing Then
            okno2 = New Form2(Me)
        End If
        okno2storno = New Form2(Me)
        okno2storno = okno2
        okno2.ShowDialog()
End Sub

    Public Sub stornovani()
        okno2 = okno2storno
        okno2.Hide()
        okno2storno.Close()
    End Sub

Ve třídě Form2 je:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'tlačítko strono
        okno1.stornovani()
End Sub

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

Nechápu, co daný kód má dělat.

Pokud potřebujete udělat okno, kde může uživatel něco změnit, a pak chcete změny odvolat tlačítkem Storno, tak to rozhodně není důvod dělat kvůli tomu druhou instanci okna.

Předpokládám, že okno zobrazuje nějaká data (např. nějaký objekt). Když okno vytvoříte a objekt s daty mu předáte, natáhne si okno hodnoty z objektu do svých komponent. Jakmile zmáčknete OK, hodnoty z komponent se uloží zpět do objektu. Pokud se zmáčkne storno, zavoláte pouze Me.Close, s objektem se nic nestane a změny se nikam neuloží. Na propojení komponent a vlastností objektu se dá použít databinding, ale na to teď můžeme zapomenout.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   Dim okno = New Form2()
   okno.Objednavka = objednavka   'předáme oknu data
   okno.ShowDialog()
End Sub

Public Class Form2

    Public Property Objednavka As Objednavka

    Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        CisloTextBox.Text = Objednavka.Cislo
        CenaNumUpDown.Value = Objednavka.Cena
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Objednavka.Cislo = CisloTextBox.Text
        Objednavka.Cena = CenaNumUpDown.Value
        Close()
    End Sub

    Private Sub StornoButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StornoButton.Click
        Close()
    End Sub
End Class

Public Class Objednavka
    Public Property Cislo As String
    Public Property Cena As Decimal
End Class
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Tento přístup vypadá o mnoho elegantněji, díky za radu, zamyslím se, upravím.

nahlásit spamnahlásit spam 0 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