22. november 2005 - 21:24Der er
13 kommentarer og 1 løsning
Sende data fra en UserControl til en anden C#
Hey jeg har noget data om en bruger (fornavn, efternavn), som indtastes på én UserControl (UC).
Mit problem er at jeg gerne vil have dette "gemt" eller i hvert fald "sendt med" til næste UC hvor bruger skal indtase flere oplysninger.
Hvis det havde været en win-app ville jeg have gemt det ned i en HashTable og så lave en metode på modtager-formen der tog denne HashTable som en parameter .. Man kan bare ikke anvende HashTables på en UC .. Desuden instantisierer jeg jo ikke noget UC'en, men redirecter bare..
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
fremgangsmåden er den samme om du vil sende fra den ene usercontrol til den anden.... det er sjældent anbefalelsesværdig at de 2 kontroller "kender hinanden"...
hvis du fra din page-klasse har mulighed for at hente det du skal bruge fra den ene kontrol, og bruge det på den anden kontrol er det vanligvis en bedre løsning.
du kan godt bruge querystring - eller session for den sags skyld... men det er der ikke nogen grund til.
hvis du har en usercontrol, hvor du har to tekstbokse:
public class A : UserControl { protected TextBox t1; protected TextBox t2; }
kan du lægge et par properties på - så du kan tilgå dem "udefra":
public class A : UserControl { protected TextBox t1; protected TextBox t2;
public string Fornavn { get{return t1.Text;} }
public string Efternavn { get{return t2.Text;} } }
og du sætter den ind på din form: <%@ Register TagPrefix="Test" TagName="A" Src="A.ascx" %>
<Test:A id="userControlA" runat="Server"/>
så kan du i din codebehind lave en deklaration:
protected A userControlA;
således at du kan tilgå teksterne i kontrollen programmatisk således :
string navn = userControlA.Navn; string efternavn = userControlA.Efternavn;
og hvis du så har en anden usercontrol
public class B : UserControl { }
kan du så lægge en metode (eller et par properties... hvad der nu passer) på, som du så stikker disse parametre:
public class B : UserControl { public void DoSomethingWithTheName(string fornavn, string efternanv) { // hvad du nu skal gøre ... } }
denne kontrol sætter du så også ind på din form, og laver en deklaration i din codebehind (det er for øvrigt blot en lille spidsfindighed i vs2003 at den ikke indsætter deklarationen for dig).
protected B userControlB;
det giver dig så mulighed for at gøre noget i denne stil i din kode:
nu ved jeg så ikke hvornår du har behov for at gøre det - men det ville være meget normalt, hvis du havde en knap på A som så skulle resultere i at der skete noget på B, og den bedste løsning på det ville være at gøre det med et event på A:
public class A : UserControl { protected TextBox t1; protected TextBox t2; // du får så en knap også protected Button knap;
public string Fornavn { get{return t1.Text;} }
public string Efternavn { get{return t2.Text;} }
// det event der kan abboneres på udefra public event EventHandler Klik;
// metode til at hæve eventet protected virtual void OnKlik(EventArgs e) { if(Klik != null) Klik(this, e); }
// en handler af klik-eventet på knappen knap protected void knap_Click(object sender, EventArgs e) { // her kan du så gøre et eller andet internt ... og derefter OnKlik(EventArgs.Empty); } }
et sådan event kan du abbonere på i din form - på samme måde som med alle andre event fra knapper ol - så du vil ende op med noget i denne stil:
hvis du laver det på den måde - har du gode muligheder for at udvide sagerne... f.eks. kunne du sørge for at bruge dit eget argument istedet for et generisk således her:
public class NavneEventArgument : EventArgument { private string _fornavn; private string _efternavn;
public string Fornavn { get{return _fornavn;} }
public string Efternavn { get{return _efternavn;} }
så kunne du lave en delegate: public delegate void NavneKlikEventHandler(object sender, NavneEventArgument e);
og i klassen a - kunne du så:
public class A : UserControl { protected TextBox t1; protected TextBox t2; // du får så en knap også protected Button knap;
public string Fornavn { get{return t1.Text;} }
public string Efternavn { get{return t2.Text;} }
// det event der kan abboneres på udefra public event NavneKlikEventHandler Klik;
// metode til at hæve eventet protected virtual void OnKlik(NavneEventArgument e) { if(Klik != null) Klik(this, e); }
// en handler af klik-eventet på knappen knap protected void knap_Click(object sender, EventArgs e) { // her kan du så gøre et eller andet internt ... og derefter OnKlik(new NavneEventArgument(navn, fornavn) ); } }
hvilket ville give dig denne mulighed i din codebehind for din form: protected void userControlA_Klik(object sender, EventArgs e) { userControlB.DoSomethingWithTheName(e.Fornavn, e.Efternavn); }
så ville du i meget vid udstrækning gøre tingene på samme måde som det gøres med alle andre kontroller du arbejder med.
(beklager hvis jeg lige fik mikset lidt rundt på navn/fornavn og den slags... håber du kan forstå hvad jeg mener... ellers må du spørge)
ja - du kan bare styre synligheden med .Visible=true/false - men de skal være i kontroltræet (hvilket de også er når du sætter dem ind deklarativt som du gør). mvh
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.