Předávání hodnot mezi formuláři   zodpovězená otázka

VB.NET

Chtěl bych se zeptat, jak předám hodnoty mezi formuláři. Pokud si vytvářím objekty a těm hodnoty přiřazuji, tak mi to nefunguje.

tlačítko druhého formuláře

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim prvniForm As New Form1
prvniForm.Label1.Text = "text druhého formuláře"
End Sub

Děkuju za odpověď

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

nevim zda pomohu ale jedná li se o text,řešil jsem to ukládáním a načítáním z text souboru popřípadě databáze

pokud jsem to tedy dobře pochopil

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

Pokud chcete pracovat s hodnotami formuláře v jeho třídě (např. v Public Class Form1) , oslovujete formulář s Me. Pokud voláte jiný formulář, oslovujete jej jeho jménem.

  Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, _ 
        ByVal e As   System.EventArgs) Handles MyBase.Load
      Me.Text = "Text prvního formuláře (Form1.text)"
    End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles Button1.Click
      Dim prvniForm As New Form1
      prvniForm.Label1.Text = Me.Text
      Me.Label1.Text = prvniForm.Label1.Text
    End Sub
  End Class

nebo jinak

  Public Class Form1
  Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
      Me.Text = "Text prvního formuláře (Form1.text)"
      Me.Label1.Text = Me.Text
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
      Dim prvniForm As New Form1
      prvniForm.Text = "Text nového formuláře (prvniForm.Text)"
      Me.Label1.Text = prvniForm.Text
    End Sub
  End Class

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

Ale ono Vám to funguje! V uvedeném kódu máte jenom jeden drobný nedostatek.

Když spustíte standardní winForms aplikaci, pokud neřeknete jinak, spustí se Vám třída Form1.

Ta si vytvoří nějakou svou instanci a běží, jednoduše se na ni odvoláváte jako na "Me" (jméno totiž neznáte).

Nyní, pokud napíšete,

Dim prvniForm As New Form1

,ta je zapotřebí si uvědomit, že vytváříte ZCELA NOVOU instanci, tedy nový "Form", který je, shodou okolností, založen na "stejné šabloně, neboli třídě", tj. na Form1.

Jinak řečeno, bude vypadat stejně jako Vaše "běžící" Form1, budou na něm stejná tlačítka a stejné prvky, ale bude to zcela samostatný objekt a mimo statických proměnných (které jsou společné všem instancím dané třídy) nebudou mít nadále již nic společného.

pokud tedy měníte text labelu:

prvniForm.Label1.Text = "text druhého formuláře"

tak jej skutečně měníte, ale nic nevidíte, protože jste si ten nový druhý form (umně nazvaný "prvniForm") nezobrazil.

zkuste tedy Váš kód upravit následovně (dovolil jsem si novému formu dát příhodnější jméno):

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dalsiForm As New Form1
dalsiForm.show()
dalsiForm.Label1.Text = "text změněn z předchozího formuláře"
End Sub

a vyzkoušejte, co to dělá - můžete i vícekrát (otevřít těch formů postupně více)

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

Nevím, komu je Vaše odpověď určená, vhodnější by byla reakce tazatele. Šlo mu o předávání hodnot mezi formuláři. To jsem snad ukázal. První ukázka má nadbytečné předávání hodnot, vím a proto jsem doplnil druhou...

Ale není nejspíš pravda, že neznám jméno formuláře po spuštění formulářové aplikace. Znám. Po založení projektu dostane formulář standardně jméno Form1, další Form2 atd. a jména jim zůstanou, pokud je ve vývojovém prostředí nezměním. Když např. v projektu přidám druhý formulář, můžu napsat

do třídy Form1

Public Class Form1
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Me.Text = "text prvního formuláře" jsem vložil ve vývojovém prostředí
    MsgBox("Text z Form2 = " & Form2.Text, , "Zde je Form1 a čte z Form2")
    Form2.Show()
  End Sub
End Class

do třídy Form2

Public Class Form2
  Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'Me.Text = "text druhého formuláře" jsem vložil ve vývojovém prostředí
    MsgBox("Text z Form1 = " & Form1.Text, , "Zde je Form2 a čte z Form1")
  End Sub
End Class

a mezi formuláři komunikovat

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

Máte plnou pravdu, omlouvám se - ale svůj příspěnek jsem bral spíše jako reakci na tazatelův kód (kde používá konstrukci "prvniForm as New Form1") a vysvětlení, proč mu to zdánlivě nefunguje a proč pak, při vzájemném volání již nemůže používat odkaz na Form1, ale na prvniForm.

A pod Vašim příspěvkem moje reakce byla pouze proto, že byla na stejné úrovni odpovědí na původní dotaz.Jinak na problémy s předáváním parametrů jsem narazil, pokud jsem každý formulář měl spuštěný v samostatném vlákně - pak jsem skutečně musel parametry a jakákoliv volání provádět prostřednictvím instančního, ne třídního názvu formuláře.

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

To je v pohodě...

Nevím proč se nejde uvnitř třídy odkazovat jménem a to musí být nahrazeno Me, ale víme tedy, že to není neexistencí jména. Tazatel tak i díky naší debatě by mohl mít problém zcela vyřešený.

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

"Nevím proč se nejde uvnitř třídy odkazovat jménem" - jakým jménem? Instance formuláře nezná název proměnné ve které existuje a pokud byste se odkazoval jménem třídy, kompilátor by si myslel že voláte statickou metodu nebo vlastnost.

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

Ak dovolíte, aj by som chcel prispiť svojou troškou do mlyna.

S výhodou sa dá požiť verejná deklarácia v module.

Module Module1
    Public spolocnyRetazec As String
End Module

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