Avatar billede noobsaibot Nybegynder
22. november 2005 - 21:24 Der 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..

Hvordan løser man dette?

På forhånd tak.
Avatar billede snepnet Nybegynder
22. november 2005 - 22:31 #1
der er ikke nogle restriktioner for hvilke typer du kan anvende på en usercontrol...

hvis din usercontrol hedder SomeUserControl, og i aspx'en har id'et uc1 - kan du i din kode lave en deklaration:

protected SomeUserControl uc1;

du kan så bare have et par properties på kontrollen (Fornavn og Efternavn), som du så sætter programmatisk.

mvh
Avatar billede noobsaibot Nybegynder
22. november 2005 - 22:40 #2
"der er ikke nogle restriktioner for hvilke typer du kan anvende på en usercontrol..." --> nej okay - havde glemt at "use" :)


"hvis din usercontrol hedder SomeUserControl, og i aspx'en har id'et uc1 - kan du i din kode lave en deklaration:" --> Hvad er det for et id?
Avatar billede noobsaibot Nybegynder
22. november 2005 - 22:42 #3
Kan jeg fx sende en HashTable fra uc1 over til uc2?
Avatar billede noobsaibot Nybegynder
22. november 2005 - 22:44 #4
Jeg vil jo ikke sende fra aspx'en til en UserControl .. men mellem 2 UserControls
Avatar billede noobsaibot Nybegynder
22. november 2005 - 22:55 #5
Ok - er med på id'et ..:

<%@ Register TagPrefix="Test" TagName="TestControl" Src="Test.ascx" %>

<Test:TestControl id="TestControl" runat="Server"/>

Men jeg ønsker, at sende fra uc1 til uc2 ..
Avatar billede noobsaibot Nybegynder
22. november 2005 - 23:24 #6
Så skal jeg måske bruge querystring istedet?
Avatar billede snepnet Nybegynder
22. november 2005 - 23:53 #7
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.

mvh
Avatar billede noobsaibot Nybegynder
22. november 2005 - 23:54 #8
Okay - jeg forstår bare ikke hvad jeg skal gøre .. :) Kan du skære det lidt mere ud i pap???
Avatar billede snepnet Nybegynder
23. november 2005 - 00:48 #9
jada...

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:

userControlB.DoSomethingWithTheName(userControlA.Navn, userControlB.Efternavn);

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:

<Test:A id="userControlA" runat="Server" OnKlik="userControlA_Klik"/>

og en handler til det i din codebehind:

protected void userControlA_Klik(object sender, EventArgs e)
{
  userControlB.DoSomethingWithTheName(userControlA.Navn, userControlB.Efternavn); 
}

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;}
  }

  public AEventArgument(string fornavn, string efternavn)
  {
    _fornavn = fornavn;
    _efteravn = 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)

mvh
Avatar billede noobsaibot Nybegynder
23. november 2005 - 00:51 #10
okay - kan man så gøre det selvom de 2 User Controls ikke er vist på samme tid?
Avatar billede snepnet Nybegynder
23. november 2005 - 00:55 #11
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
Avatar billede noobsaibot Nybegynder
11. august 2006 - 23:39 #12
Smid et svar. Så lukker vi :)
Beklager at jeg ikke har svaret tilbage før - er lige ved at ryde op.
Avatar billede snepnet Nybegynder
11. august 2006 - 23:47 #13
Kommer her :o)
Mvh
Avatar billede snepnet Nybegynder
11. august 2006 - 23:47 #14
I hver fald her ;o)
Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester