[C#] Objecten aanspreken op andere forms

Pagina: 1
Acties:

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 16:33
Hoe kan ik in C# een object aanspreken dat zich op een ander form bevindt ??
Ik open nu vanuit Form1 een ander form met ShowDialog.
Dit tweede form moet nu van een object op Form1 een lijst met strings opvragen en deze in een ComboBox zetten.
Daarna moet, na het selecteren van een string, het form gesloten worden en op Form1 de gekozen waarde in een variabele gezet.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum ik denk dat het met C# hoog tijd wordt om niet in termen van 'objecten aanspreken op andere forms' te denken.

Als je een goede opzet van je applicatie hebt, weten forms zo min mogelijk van elkaar en probeer je data niet direct uit forms te halen. Sowieso is alles een object dus je vraag is eigenlijk te specifiek :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

kan dat niet zo:
form1.ding.caption:=form2.ding.caption


kweenie ik ijl maar wat

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Op vrijdag 21 december 2001 15:17 schreef Zoepnek het volgende:
kan dat niet zo:
form1.ding.caption:=form2.ding.caption


kweenie ik ijl maar wat
Denk niet dat dat de goede manier is. Hoe het in C# precies moet , weet ik nog niet. (Ben er wel een boekie van C# aan het lezen, maar heb er nog niets concreets gedaan).

Maar in Delphi doe ik het zo:

Stel, je hebt Form1 en Form2. Form1 opent een instance van Form2. Op die instance van Form2 geef je een aantal gegevens in, die Form1 moet terugkrijgen.

code in Form1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure OpenForm2(Sender : TObject);
var
  frm   : TForm2;
begin
  frm  := TForm2.Create (self);
  frm.HaalGegevens := GetData;
  frm.Show();
end;

procedure GetData (Sender : TObject);
begin
  SomeDataFromForm2 := TForm2(Sender).Edit1.Text;
end;

En in uw classdefinitie van Form2 maak je een NotifyEvent aan,
code:
1
2
3
4
5
  private
    FHaalGegevens : TNotifyEvent;
  public
    property HaalGegevens : TNotifyEvent read FHaalGegevens
                             write FHaalGegevens;

Achter de Ok knop trigger ik dan die event:
code:
1
  HaalGegevens (self);

Ik weet het, dit is Delphi, maar ik vermoed dat in C# wel iets gelijkaardigs zal mogelijk zijn.

https://fgheysels.github.io/


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:13

Crazy D

I think we should take a look.

Op vrijdag 21 december 2001 15:13 schreef mbravenboer het volgende:
Hum ik denk dat het met C# hoog tijd wordt om niet in termen van 'objecten aanspreken op andere forms' te denken.
Gewoon puur theoretisch, hoe zou jij dat dan opzetten?
Ik weet nog lang niet zoveel van OO als dat ik zou willen (;)), met mijn huidige kennis zou ik een property/functie maken om een object op form2 te vullen, en om een waarde terug te geven het met een event te doen, maar ik voel aan m'n water dat dat niet helemaal the OO way to go is?

Exact expert nodig?


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
In het meest ideale geval zou je met modellen moeten werken. Modellen geven de inhoud van een userinterface aan. Als het model verandert, verandert de userinterface automatisch mee. Als er vanuit de userinterface acties plaatsvinden pas je het model aan en niet de userinterface.
Waarom is dit aan te raden? Event-afhandeling, applicatie logica en data worden zo gescheiden van de userinterface: Je kunt gerust een andere user-interface gebruiken voor hetzelfde model en events.

Hoe is dit concreet te vertalen in deze situatie?
Form1 heeft een bepaalde waarde nodig die aangepast kan worden. Deze waarde zit in een model. Liefst is dit gewoon een domein-object en geen String. Als er in de form op een bepaalde knop wordt gedrukt wordt er in de gescheiden event afhandeling een nieuw model aangemaakt waarin alle mogelijke waarden zitten en een geselecteerde waarde: de huidige waarde in form1. form2 kan dit model gebruiken om eeb ComboBox te maken, maar dit mag ook een ander component zijn. Als form2 wordt gesloten wordt de huidig nieuwe geselecteerde waarde uit het model gehaald en in het model van form2 gezet :) .

Helaas moedigen de .NET WinForms model gebaseerd werken absoluut niet aan ;( . Het is te hopen dat er spoedig een library komt on-top-of de WinForms die dit mogelijk maakt. Model gebaseerd werken is in simplistische gevallen nogal een overkill als de GUI library geen support voor model gebaseerd werken biedt. Als dit wel het geval is, kan het ook in eenvoudige situaties zelfs nog de meest handige keuze zijn :) .

Als je de modellen weghaalt uit dit verhaal heb je een eenvoudigere oplossing die in dit geval wel goed bruikbaar is.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 16:33
Op vrijdag 21 december 2001 15:13 schreef mbravenboer het volgende:
Hum ik denk dat het met C# hoog tijd wordt om niet in termen van 'objecten aanspreken op andere forms' te denken.

Als je een goede opzet van je applicatie hebt, weten forms zo min mogelijk van elkaar en probeer je data niet direct uit forms te halen. Sowieso is alles een object dus je vraag is eigenlijk te specifiek :) .
In dit geval is het gewoon erg handig als de forms wel wat van elkaar weten:
ik heb op Form1 een instantie van de Windows Media Encoder (zie ook andere topics) en op Form2 wil ik een lijstje met alle Profiles laten zien zodat er een gekozen kan worden.
Nu is het dus een stuk handiger als Form2 gewoon even het object Encoder gebruikt van Form1 en daaruit alle mogelijke Profiles haalt.
Na een keuze gemaakt te hebben slaat Form2 deze waarde op in een variabele van Form1 zodat Form1 hier meteen gebruik van kan maken.
Op vrijdag 21 december 2001 15:17 schreef Zoepnek het volgende:
kan dat niet zo:
form1.ding.caption:=form2.ding.caption


kweenie ik ijl maar wat
Volgens mij werkt jij veel met Delphi, ik zat namelijk precies hetzelfde te proberen. :)
En achteraf blijkt dit toch de goede methode te zijn. Maar ik moest wel even de variabelen/objecten declareren als 'internal static'.
Nu werkt het dus perfect !

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 19:13

Crazy D

I think we should take a look.

Op vrijdag 21 december 2001 18:11 schreef mbravenboer een mooie uitleg
Ik geloof dat ik wel zo'n beetje begrijp :)
Tnx voor de uitleg :)

Exact expert nodig?

Pagina: 1