Avatar billede steen Nybegynder
27. juli 2005 - 14:53 Der er 8 kommentarer

fra en usercontrol til en anden

Hvordan gør jeg følgende:

Jeg har en default.aspx der skal indeholde 2 usercontrols; den første indeholder en knap, som når denne klikkes på, skriver "hello world" i den anden usercontrols label?

Jeg forestiller mig at default.aspx skal indeholde så lidt kom som overhovedet mulig.

Jeg arbejder i MS VS.net 2003 med code behind

Venligst i C#
Avatar billede snepnet Nybegynder
27. juli 2005 - 16:03 #1
hej steen :o)

en pæn måde at gøre det på kunne være følgende :
(der er mange løsninger - men nedenstående er sådan rimelig enkel, og du kan sikre dig at du kan lave tricket på en hvilken som helst kontrol).

public interface ITarget
{
  void SetText(string text);
}

public TargetControl : UserControl, ITarget
{
  ...

  protected Label lblText;
 
  public void SetText(string text)
  {
    lblText.Text = text;
  }
 
  ...
}

public SourceControl : UserControl
{
  ...
 
  private ITarget _target;
  public ITarget Target
  {
    get{return _target;}
    set{_target = value;}
  }
 
  ...
 
  // handler af knapklik
  protected void someButton_Click(object sender, EventArgs e)
  {
    if(Target != null)
    {
      Target.SetText("Hello world");
    }
}

du må bare spørge, hvis der er noget du er i tvivl om.

mvh
Avatar billede steen Nybegynder
27. juli 2005 - 17:34 #2
Hej Snepnet,

Kigger ivrigt dit eks. igennem. Kan jeg lokke dig til at skrive nogle kommentarer i koden, og enda forklare om det er i selve usercontrol-filen eller hvor du skriver ovenstående.

/Steen
Avatar billede snepnet Nybegynder
27. juli 2005 - 22:56 #3
Hej igen Steen - det kan du såmænd godt :o)

// her defineres et interface
public interface ITarget
{
  void SetText(string text);
}

// her er så en usercontrol, hvor ovenstående interface er implementeret, hvilket
// vil sige - at kontrollen derved "lover" at have implementeret en metode
// der hedder SetText - som defineret under interfacet
// det er et udpluk af din code-behind kode til en usercontrol du skal kunne
// påvirke fra en anden.
public TargetControl : UserControl, ITarget
{
  ...
 
  // her sådan lidt symbolsk - sådan vil koden se ud, hvis du har sat en labl
  // ind i designeren i vs.
  protected Label lblText;
 
  // her er metoden under interfacet implementeret
  // kaldes den - sætter man bare teksten på ovenstående label
  public void SetText(string text)
  {
    lblText.Text = text;
  }
 
  ...
}

// dette er et udpluk af din codebehind-fil til den usercontrol
// der skal kunne påvirke noget i en anden usercontrol.
public SourceControl : UserControl
{
  ...
 
  // her angivet hhv. en membervariabel og en property
  // (der mapper til membervariablen)
  // sikrer at du på denne kontrol kan "pege" på noget der implementerer ITarget.
  private ITarget _target;
  public ITarget Target
  {
    get{return _target;}
    set{_target = value;}
  }
 
  ...
 
  // handler af knapklik
  // hvis Target er angivet - kaldes metoden SetText dette.
  // forudsætter at du har sat ind knap ind på din form, og oprettet en handler
  // til klik-eventet (i vs dobbeltklikker du jo bare på knappen i designeren,
  // så oprettes handleren til dig i koden.
  protected void someButton_Click(object sender, EventArgs e)
  {
    if(Target != null)
    {
      Target.SetText("Hello world");
    }
}

hvis vi nu siger, at du har sat begge ovenstående usercontrols ind på en form, sådan her:
<uc1:SourceControl ID="sourceControl" runat="server" />
<uc2:TargetControl ID="targetControl" runat="server" />

// sørge for at du kan arbejde med kontrollerne i koden:
// (du skal blot lave deklerationen i koden, frameworket initialiserer dem,
// i og med at de er angivet i aspx-filen.
protected SourceControl sourceControl;
protected SourceControl targetControl;

så kan du - f.eks. i page_load, gøre følgende:
sourceControl.Target = targetControl;
hvilket sikrer dig, at din sourcecontrol - kender den targetcontrol hvis SetText-metode skal kaldes, hvorved metoden vil blive kaldt, når du klikker på knappen på din sourcecontrol.

bare råb op, hvis du stadig er i tvivl om noget.

mvh
Avatar billede steen Nybegynder
28. juli 2005 - 08:03 #4
Tusind tak... det kalder jeg "kommentarer"

Et sidste spørgsmål: er det nu også den rigtige måde jeg vælger at gøre det på?
Hensigten er med tiden at jeg får udviklet en "skabelon"-agtig default side, hvorpå der placeres forskelligt indhold (usercontrols), og enkelte af disse usercontrols skal kunne kommunikere sammen. F.eks. kunne jeg lave en usercontrol, indeholdende en kalender, som hvis man klikker på en dato, vises et opslag i en database for den angivne dato i en anden usercontrol (indholdsvisning)

Mvh. Steen
Avatar billede steen Nybegynder
28. juli 2005 - 11:56 #5
og hit med et svar ;-)
Avatar billede snepnet Nybegynder
28. juli 2005 - 12:18 #6
et svar får du her :o)

om det er den rigtige måde at gøre det på .... det er et godt spørgsmål... det er en mulig løsning...

normalt vil jeg anbefale at du sørger for at holde koblingen mellem dine usercontrols udenfor den enkelte kontrol, således at din kontroller overhovedet ikke kommunikerer direkte med hinanden.

i det eksempel du nævner - ville det det kunne fikses ved at den kontrol der indeholder kalenderen, hæver et event når der vælges en dato.
på din form opsamler du så det event, og kalder en metode ell. på den kontrol der skal vise opslaget.

så kender kontrollerne ikke noget som helst til hinanden, og de vil kunne benyttes uafhængigt af hinanden.

der kan sagtens være situationer hvor du kan have fordel af andre løsninger, men mulighederne for at implementere den slags er meget omfattende, så det kan jeg ikke lige liste op her (så skal jeg vide lidt mere om hvad du satser på det skal kunne til sidst).

du er velkommen til at lægge din messengerkonto, så kan vi godt skrive lidt om det der.... jeg vil meget gerne hjælpe med det.

mvh
Avatar billede snepnet Nybegynder
07. august 2005 - 00:48 #7
hej steen :o)
accepterer du svaret så vi kan lukker her?
mvh
Avatar billede snepnet Nybegynder
07. september 2005 - 17:00 #8
steen?
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