[.NET] Data tussen twee forms. bindings? globale variable?

Pagina: 1
Acties:

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Hallo,

Ik wil vanaf frmMain data(een String Array en een Byte) sturen naar een nieuw Form, dit lukt. Maar, er moet ook weer data van dat nieuwe Form teruggestuurd worden naar het frmMain. Dat lukt me niet. Ik heb nu ongeveer het volgende:

Ik heb dus twee Forms, frmMain en frmAdd.
Als ik in frmMain op een bepaalde knop klik, gebeurt het volgende:
code:
1
2
3
frmNew As new frmAdd
frmNew.Send(GroupArray, nr_of_groups)
frmNew.Show()


In frmAdd staat een Public Function om data te krijgen, namelijk:
code:
1
2
3
Public Function Send(ByVal GroupArray As Object, ByVal nr_of_groups As Byte)
      ' hier word de data in een ComboBox gegooid
End Function


Tot nu toe werkt het goed, frmNew (frmAdd) word getoont en de ComboBox is gevuld met de data van frmMain.

Nu wil ik dus dat op het moment dat er op Ok geklikt is op frmNew (frmAdd), data (3 strings en een Byte) terug gestuurd wordt naar frmMain.

Nu dacht ik ik voeg gewoon een zelfde soort Public Function Send op frmMain toe, en doe dan het volgende wanneer er Ok geklikt is:
[code]
frmNewMain As new frmMain
frmNewMain.Send(String1, String2, String3, groupNr)
frmNewMain.Close()
[code]

Maar goed, nu zit ik met het probleem dat een nieuw frmMain heb, en volgens mij kan dat beter niet. En behalve dat is het nog niet gelukt om die data te krijgen in frmMain (staat natuurlijk in frmMewMain, maar dat wil ik dus niet). Nu heb ik dus een Handler nodig op frmMain die ziet wanneer er Ok is gedrukt op frmNew (frmAdd).

Ik heb al veel gezocht en gevonden op Google, maar het wil mij maar niet lukken :(
DataBindings kon ik doen, maar dat lukt me helemaal niet :). Ik kon ook een Module aanmaken en daar Globale Variable inzetten waarbeide Forms mee werken. Dat heb ik nog het liefst, maar dat lukte me ook niet. Ook heb ik Property's met Get en Set gemaakt, maar dat wil helemaal niet, probeer daar maar eens meerdere variablen doorheen tegelijk te sturen is mij een vraag.

Al met al ik probeer allerlei oplossingen maar het lukt me niet echt. Dit komt natuurlijk door mijn lack on vb .net skills :( Ik hoop dat iemand mij kan vertellen wat ik het beste kan doen, en hoe ik de dingen doe die me niet lukken :)

Thnx in advance for any help!

Wat een onzin..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

frmNewMain As new frmMain
Je maakt hier een nieuwe form aan; dit wil je niet. Je moet een reference maken naar je bestaande form.

Immers, die nieuwe form is nergens aan gekoppeld.

[ Voor 16% gewijzigd door gorgi_19 op 28-10-2003 21:27 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Ok, hoe maak ik een reference naar m'n bestaande frmMain? gewoon frmNewMain = frmMain ofzo? :) Ik ga ff proberen en zoeken naar reference moment.

Wat een onzin..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Gewoon zichzelf bijvoorbeeld ook meesturen bij de creatie? Of maak er netjes een Mediator Pattern van.

Visual Basic .NET:
1
Private __myCustomForm as MyCustomForm = new MyCustomForm(Me)


Sowieso; was het niet zo dat je 1 form hebt, en daar meerdere panels in hangt?

[ Voor 48% gewijzigd door gorgi_19 op 28-10-2003 21:33 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Moet ik dat dus in frmMain aan het begin doen, en dan vanuit frmAdd myCustomForm.Send aanroepen?

frmMain en frmAdd zijn twee verschillende bestanden..

[ Voor 90% gewijzigd door dixon op 28-10-2003 21:35 ]

Wat een onzin..


Verwijderd

Ik had dus een poosje terug hetzelfde probleem onder C#
Dat heb ik opgelost door gebruik te maken van de properties. Dan maak je het als het ware net als bij b.v. een filedialogbox. (kreeg ik mijn idee ook van)

Vanaf je Form main je 2e form openen en bepaalde waarden meegeven (lukt je al)
Na sluiten 2e form lees je vanuit je main form de benodigde properties uit van het 2e form. En dan kan je het 2e form verbergen o.i.d.

toevoeging:
Voor meerdere gegevens kan je meerdere properties aanmaken.

[ Voor 9% gewijzigd door Verwijderd op 28-10-2003 21:36 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Kijk eens in de FAQ, daar vind je oa deze link:
[rml]whoami in "[ VB.NET] waardes van een andere form?"[/rml]

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Thnx whoami, waarom ik dat nog niet eerder gevonden had? hmmz, zal de thc zijn :) Ik ga ff kijken, tis wel C# maar het lijkt erop :)

Wat een onzin..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Waarom heb je hier voor deze oplossing gekozen? Bestaat het gevaar dan niet dat de classes te zeer met elkaar verweven zijn? Is bijvoorbeeld een mediator al niet snel een beter alternatief?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
De classes met elkaar verwerven? Hoezo dat? Zoiezo maakt het me niet uit of me Data niet veilig is als je dat bedoelt.. gaat er ff om dat het werkt :) ja ik weet het ben een slechte programmeur :(

En wat is een mediator?

Wat een onzin..


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
gorgi_19 schreef op 28 October 2003 @ 21:40:
[...]

Waarom heb je hier voor deze oplossing gekozen? Bestaat het gevaar dan niet dat de classes te zeer met elkaar verweven zijn? Is bijvoorbeeld een mediator al niet snel een beter alternatief?
gorgi aan de design patterns. :P

Ze zijn niet te zeer met elkaar verweven, want een detailform kan in deze situatie enkel maar geopend worden door een lijstform.
Zowiezo zijn die objecten niet te veel met elkaar verweven, want eigenlijk kan je perfect een detail-scherm maken zonder dat je een listscherm nodig hebt: het detailscherm weet nl. niets af van het lijstscherm. Dmv de delegate op het detailscherm wordt er eventueel functionaliteit op het lijstscherm uitgevoerd.
Het lijstscherm opent het detailscherm, dus het lijstscherm moet wel de interface van het detailscherm kennen.

Die classes zouden pas sterk met elkaar verweven zijn als je in je lijstscherm bv volgende code opnam:
code:
1
2
3
4
5
6
if( frmDetail.ShowDialog() == DialogResult.OK )
{
     // do some stuff
     int blaat = frmDetail.anIntegerValue;
     this.SetValue(blaat);
}

Daarnaast is een mediator imo onnodig in dit voorbeeld omdat het geen complexe communicatie is tussen de verschillende objecten.

[ Voor 12% gewijzigd door whoami op 28-10-2003 21:45 ]

https://fgheysels.github.io/


Verwijderd

Misschien een beetje offtopic, maar is dat niet een beetje omslachtige manier?

In de standaard dialogs voor files en printers wordt toch ook gebruik gemaakt van properties.. En dat is toch hetzelfde.. eigenlijk. Dat zijn ook 2 forms, oke het dialog is wel een speciaal form, maar goed. Principe blijft gelijk.

Hiermee blijven je forms compleet onafhankelijk van elkaar en dus herbruikbaar.

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
He , het word steeds ingewikkelder :) Ik denk dat iemand me beter kan uitleggen hoe ik een globale variable maak en gebruik, dan ben ik tevreden :)

Wat een onzin..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 28 October 2003 @ 21:43:
[...]
gorgi aan de design patterns. :P
* gorgi_19 wijst naar Alarmnummer, Glimi en jou; jullie schuld.. :+ Maar ben er al een tijdje mee bezig.. :P
Een hele uitleg...
De communicatie hoeft naar mijn idee niet complex te zijn; ongeordend vind ik ook al een maatstaf om te grijpen naar dit pattern. Evenals dat je verwacht als er nog meer classes bij gaan komen.

Je hebt echter wel gelijk dat een master/detail relatie dit pattern overbodig is, aangezien dit mij een 1-1 relatie lijkt.
Verwijderd schreef op 28 October 2003 @ 21:44:
[...]


Misschien een beetje offtopic, maar is dat niet een beetje omslachtige manier?

In de standaard dialogs voor files en printers wordt toch ook gebruik gemaakt van properties.. En dat is toch hetzelfde.. eigenlijk. Dat zijn ook 2 forms, oke het dialog is wel een speciaal form, maar goed. Principe blijft gelijk.

Hiermee blijven je forms compleet onafhankelijk van elkaar en dus herbruikbaar.
Hoe wil je dat die property de goede waarde heeft? Je zult minstens een reference moeten maken, zoals ik deed, of een delegate moeten gebruiken, zoals whoami deed.

Daarnaast blijft het ook met het gebruik van delegates nog steeds bruikbaar voor andere gedeelte code.

[ Voor 45% gewijzigd door gorgi_19 op 28-10-2003 21:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Verwijderd schreef op 28 October 2003 @ 21:44:
[...]


Misschien een beetje offtopic, maar is dat niet een beetje omslachtige manier?
Nee, niet echt.
Op deze manier ben je veel flexibeler en kunnen je lijst en detail-forms onafhankelijk van elkaar bestaan.
In mijn voorbeeld kan je bv. zonder al te veel geklooi een detail-scherm openen die andere functionaliteit uitvoert op het lijstscherm.

https://fgheysels.github.io/


Verwijderd

Eehmm... globale variabelen zijn niet zo gemakelijk meer als vroeger.. helaas :(
(tenminste dat is mijn ervaring in VC++)

Ik zal je wel een voorbeeld geven hoe ik het gedaan heb:

Form_Lessen wordt aangeroepen door mainform en heeft een property genaamd LesID

code:
1
2
3
Form_Lessen Lessen = new Form_Lessen();
Lessen.ShowDialog();
Variabele = Lessen.LesID;



Property in Form_Lessen:
code:
1
2
3
4
5
6
7
public int LesID
        {
            get
            {
                return m_VisibleLesID;
            }
        }


Terwijl de gebruiker op OK klikt in Form_Lessen, vult het programma (in dit geval) de waarde m_VisibleLesID. Deze waarde wordt terug gegeven als de property Lessen.LesID.

Veel makkelijker kunnen we het niet maken d8 ik zo ;)

succes

@gorgi_19
zoals je ziet wordt de property van Form_Lessen gevuld vanuit een functie binnen Form_Lessen. Daarom zijn geen delegates o.i.d. nodig (8>

[ Voor 10% gewijzigd door Verwijderd op 28-10-2003 21:54 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 28 oktober 2003 @ 21:52:
Eehmm... globale variabelen zijn niet zo gemakelijk meer als vroeger.. helaas :(
(tenminste dat is mijn ervaring in VC++)
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
    Public Class Globals
        Private Shared __aValue As String = ""

        Public Shared Property GetValue() As String
            Get
                Return __aValue
            End Get
            Set(ByVal Value As String)
                __aValue = Value
            End Set
        End Property

    End Class

?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Verwijderd schreef op 28 October 2003 @ 21:52:
Eehmm... globale variabelen zijn niet zo gemakelijk meer als vroeger.. helaas :(
(tenminste dat is mijn ervaring in VC++)
globale variablen zijn evil.
Terwijl de gebruiker op OK klikt in Form_Lessen, vult het programma (in dit geval) de waarde m_VisibleLesID. Deze waarde wordt terug gegeven als de property Lessen.LesID.
Niet helemaal.
Als de gebruiker op cancel drukt (of het form gewoon afsluit), dan zal die m_VisibleLesId ook de waarde krijgen van Lessen.LesId

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 28 oktober 2003 @ 21:53:
globale variablen zijn evil.
offtopic:
Niet per definitie.. Ik mag hopen voor je dat je je ResourceManager als global var definieert. Dat ding is anders echt niet vooruit te branden. :P
@gorgi_19
zoals je ziet wordt de property van Form_Lessen gevuld vanuit een functie binnen Form_Lessen. Daarom zijn geen delegates o.i.d. nodig
Je blijft nu in 1 class. Maar als je dit nu niet hebt, wat dan?

[ Voor 28% gewijzigd door gorgi_19 op 28-10-2003 21:57 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Verwijderd schreef op 28 October 2003 @ 21:52:
@gorgi_19
zoals je ziet wordt de property van Form_Lessen gevuld vanuit een functie binnen Form_Lessen. Daarom zijn geen delegates o.i.d. nodig (8>
Om een variable te vullen vanuit dezelfde class heb je idd geen delegates nodig.
Echter, als je een beetje form-communicatie wilt met wat flexibiliteit, dan kom je algauw op het gebruik van delegates uit.

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Thnx alot Aai, kga het meteen proberen. Het enige wat ik niet snap, is dat bij:

Variabele = Lessen.LesID;

als je dit aanroept, wacht je programma dan tot je het nieuwe Form lessen gesloten hebt? En doet ie dan pas Variable = Lessen.LesID; ?

Zoiezo, dit stukje code staat in een button handler neem ik aan?
code:
1
2
3
Form_Lessen Lessen = new Form_Lessen();
Lessen.ShowDialog();
Variabele = Lessen.LesID;

Wat een onzin..


Verwijderd

whoami schreef op 28 October 2003 @ 21:53:
[...]

globale variablen zijn evil.
Helemaal mee eens!
Niet helemaal.
Als de gebruiker op cancel drukt (of het form gewoon afsluit), dan zal die m_VisibleLesId ook de waarde krijgen van Lessen.LesId
Sterke opmerking.
Daar had ik nog niet aan gedacht! :o
Daarom moet je eigenlijk altijd checken of de OK of de CANCEL knope van het form is gebruikt. Die kan je ook weer instellen bij de property's van een knop.


Ooo jee.. 't is een poosje terug... Maar als je de m_VisibleLesId een waarde geeft in de handler van je Ok button van je form is er niks aan de hand. :o

[ Voor 14% gewijzigd door Verwijderd op 28-10-2003 22:04 ]


Verwijderd

dixon schreef op 28 October 2003 @ 21:57:
Thnx alot Aai, kga het meteen proberen. Het enige wat ik niet snap, is dat bij:

Variabele = Lessen.LesID;

als je dit aanroept, wacht je programma dan tot je het nieuwe Form lessen gesloten hebt? En doet ie dan pas Variable = Lessen.LesID; ?

Zoiezo, dit stukje code staat in een button handler neem ik aan?
code:
1
2
3
Form_Lessen Lessen = new Form_Lessen();
Lessen.ShowDialog();
Variabele = Lessen.LesID;
Helemaal correct! ;)

bij: Variabele = Lessen.LesID;
kopieer je in principe alleen de waarde van de property "Lessen.LesID" naar een variabele.
Het 2e form is dan al gesloten, doordat de gebruiker b.v. op de OK knop gedrukt heeft.

[ Voor 8% gewijzigd door Verwijderd op 28-10-2003 22:02 ]


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 16-08 17:19
Mooi, het is allemaal gelukt! Op naar het volgende probleem :(
:)

Wat een onzin..

Pagina: 1