Få adgang til controls på 2. form fra hoved form

Tags:    c#

Hej alle sammen.

Jeg sidder og leger lidt med C#, men er stødt på lidt af et problem.

Jeg har 2 forme. En hovedform og en dialog form.

Når programmet køres, vises dialogen og man kan indtaste noget i en textbox og derefter klikke på OK.

Når man så klikker på OK, så lukkes formen, og her er det mit problem opstår.

Jeg kan ikke få fat i det data som brugeren har indtastet i textbox'en fra form2 (altså dialogen).

Jeg har prøvet med det her, men det virker bare ikke.

Fold kodeboks ind/udCSharp kode 


Jeg har fundet en anden løsning, men ville lige høre om det virkelig kan være rigtigt at jeg ikke kan få adgang til dialogens data på anden måde.
http://www.homeandlearn.co.uk/csharp/csharp_s13p3.html

Jeg er ud fra linket nået frem til dette:
Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 25.02.2009 13:33 af Bruger #8254
9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Den ene måde du kan gøre det på er at gøre din textbox public, ved at gå ind i din designer (Form2.Designer.cs) og ændre:
Fold kodeboks ind/udKode 

til:
Fold kodeboks ind/udKode 


Den anden (hvilket jeg benytter), er at lave en public function i din anden form der returnérer textbox'ens indhold, således:
Fold kodeboks ind/udKode 


Og så på din første form:
Fold kodeboks ind/udKode 



Du kan selvfølgelig også lave en function der returnérer hele textboxen hvis du skal tilgå mange egenskaber i texboxen end bare text.

Således:
Fold kodeboks ind/udKode 


Og på din form1:
Fold kodeboks ind/udKode 



Hvordan du gør er helt op til dig selv. Smag og behag.


Hvis du har en login form, hvor folk skal skrive et navn/kode, så kunne du lave funktionerne således:
Fold kodeboks ind/udKode 



Du kunne også bruge en struct, hvilket måske er en fordel ved mange ting der skal returnéres.
Fold kodeboks ind/udKode 


Og så på din form1:
Fold kodeboks ind/udKode 




Jeg anbefaler så at du får din OK knap på din form 2 til at sætte formens DialogResult til DialogResult.OK, for at fortælle din form1 at brugeren valgte OK, og ikke Cancel, eller bare lukkede vinduet.

Du kan enten sætte DialogResult som en egenskab på knappen i design-time,

eller når der klikkes på knappen. Jeg foretrækker sidstnævnte.

Så koden til din OK knap på Form2:
Fold kodeboks ind/udKode 


Bemærk, at når DialogResult bliver sat, så lukker formen.


Når du så på din form1 kalder formen så kan du lave et tjek på ShowDialog() for at se om brugeren valgte OK, eller annullérede:

Fold kodeboks ind/udKode 




Håber det gav svar på dit spørgsmål.



Du kan jo godt få fat på form2 jo. Du kan bare ikke tilgå non-public medlemmer. Du kan via en event sende data som argumenter, ligesom et normalt metodekald.
Fold kodeboks ind/udCSharp kode 


Så kan du kalde PassDataEvent således:
Fold kodeboks ind/udCSharp kode 


Note: Ovenover er ikke best practice (ms-techy speak!), man skal lige huske at gemme PassDataEvent i en variabel, så man undgår race conditions i en multithreaded applikation.

Du forstår nok pointen. Men umiddelbart ville jeg, i det her tilfælde, bare lave en public property, da det virker fint, uden den ekstra kompleksitet med events (ikke at de er så satans komplekse, men alligevel mere end en property).

Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 26.02.2009 22:17 af Bruger #345
En mulighed kan være at du overfører værdierne til en anden klasse, hvorefter du kan hive dem ud fra din hoved form.

Fold kodeboks ind/udCSharp kode 


Og det er det samme som du gør, her har jeg bare brugt en klasse til det.



Indlæg senest redigeret d. 25.02.2009 16:00 af Bruger #6559
Du er stødt på access problemer (Nej, ikke databasen!)
Du kan sagtens tilgå textbox'en fra form 2, hvis du gør den public. Det er en fundemental del af OO. Men jeg vil absolut fraråde dig den fremgangsmåde, da du eksponere data fra dit objekt som klienten ikke bør have viden om.



Du er stødt på access problemer (Nej, ikke databasen!)
Du kan sagtens tilgå textbox'en fra form 2, hvis du gør den public. Det er en fundemental del af OO. Men jeg vil absolut fraråde dig den fremgangsmåde, da du eksponere data fra dit objekt som klienten ikke bør have viden om.


Det virker at lave textbox'en pubic :) Men hvad er det for data som klienten (hvem er det forresten) får adgang til som den ikke burde?

Anyway, hvad ville du anbefalde mig at gøre, hvis jeg ikke skulle lave den public? Den metode som jeg allerede har fundet, og som Martin også foreslår?



Indlæg senest redigeret d. 26.02.2009 10:02 af Bruger #8254
Du kan også gøre det at du benytter events til at sende oplysningerne gennem.



Du kan også gøre det at du benytter events til at sende oplysningerne gennem.


Hvordan kan jeg via events sende oplysningerne, når jeg ikke kan få adgang til form2 via form1 og omvendt?



Lige det jeg ikke havde tiden til at forklare Brian med events (og tak for det) :)

For mig at se er events den bedste løsning. Bl.a. fordi kontrollen så vil give besked lige i det øjeblik den har informationerne og eventet bliver kaldt. En property er til gengæld tilgængelig hele tiden...



Pointen her er at han først har brug for informationen når der bliver klikket på OK knappen. Derfor virker events ikke som den bedste løsning, fordi her vil der blive opdateret hele tiden, muligvis på et tidspunkt hvor det ikke er hensigtsmæssigt (Det ved jeg dog ikke om det er her).

Mønstret jeg havde i tankerne var noget i stil med
Fold kodeboks ind/udCSharp kode 




t