Avatar billede wired Nybegynder
28. juli 2004 - 07:51 Der er 21 kommentarer og
1 løsning

Kommunikation fra usercontrol til usercontrol

Hvad er den object-mæssige korrekte måde af kommunikere mellem to usercontroller?

Jeg har følgende(plus mere men her er bare essensen) usercontroller på min side:

<uc1:filmstrip id="FilmStrip1" runat="server">
<uc1:globe id="Globe1" runat="server">

Når jeg trykker på en knap i filmstrip skal en event i globe gerne reagere. Det kan jeg gøre med i filmstrip og en minsub_click i globe:

AddHandler knap.Click, AddressOf minsub_Click

men så skal alt pludselig til at være shared.
Er der ikke en mere korrekt object-mæssig måde at løse problemet på?
Avatar billede snepnet Nybegynder
28. juli 2004 - 08:13 #1
Jeg ville mene at en god løsning kunne være :

1) Sørg for at du filmstrip skal kunne abbonnere på et event.
2) At du sørger for at lægge en metode på globe der kan gøre det den nu skal.
3) Sørg for at binde de to ting samme i containeren (sikkert din form / page).

Det skulle gerne ende med at du kan holde de to kontroller uafhængige af hinanden.
Avatar billede wired Nybegynder
28. juli 2004 - 08:40 #2
Hmm.. lyder interessant, men er det evt. muligt med et eksempel?
Pga. min begrænset viden, lyder det lidt som om at jeg bliver nød til at share minsub og gør jeg det skal alle de sub som den anvender også være share.
Avatar billede snepnet Nybegynder
28. juli 2004 - 08:42 #3
Jeg er på vej ud af døren - men jeg skal nok skrive et eksempel til dig senere, hvis ikke andre har gjort det :o)
Avatar billede wired Nybegynder
28. juli 2004 - 08:54 #4
1000 tak... Det ser jeg vildt frem til.... ses
Avatar billede snepnet Nybegynder
28. juli 2004 - 22:57 #5
hej wired... er du der ?
Avatar billede wired Nybegynder
28. juli 2004 - 23:01 #6
Nu er jeg...
Avatar billede snepnet Nybegynder
28. juli 2004 - 23:12 #7
Har du nogensinde lavet en klasse der kan fyre events af ?
Avatar billede wired Nybegynder
29. juli 2004 - 01:25 #8
Ikke i praksis, havde håbet lidt på at jeg kunne undlade at lave nye klasser for at følge asp.net' run-cycle. Men jeg er meget huk på at høre nærmere herom hvis det er det der skal til. Måske vi kunne chatte via messenger, min hotmail er hvorfandenermellemrumstasten@hotmail.com. I såfald få du selvfølgelig 200 point.
Avatar billede snepnet Nybegynder
29. juli 2004 - 01:31 #9
Nu spurgte du jo efter den "objekt-mæssigt" rigtige måde at gøre det på - og man bliver nok nødt til at skele lidt til hvordan frameworket er skruet sammen i den forbindelse :o)
Det er jo i høj grad baseret på events, men det er ikke så svært at lave... Vil du se et lille eksempel ?
Avatar billede snepnet Nybegynder
29. juli 2004 - 01:32 #10
For øvrigt en ufattelig sjov adresse du havde der på hotmail :o)
Avatar billede wired Nybegynder
29. juli 2004 - 01:34 #11
Ja meget gerne :-)
Avatar billede snepnet Nybegynder
29. juli 2004 - 01:54 #12
Ok... prøv at se på nedenstående :

Hvis der findes sådan en delegate her i din kode :
public delegate void SomethingEventHandler(object sender, SomethingEventArgs e);

Så kan du give mulighed for at abbonere på et Something-event i hvilen som helst klasse sådan her :

public event SomethingEventHandler Something;

Et sted i samme klasse kan du så fyre eventet af ved
  Something(this, e) // e er af typen SomethingEventArgs

Hvilket man kun behøver at gøre hvis der er nogle der gider at lytte (altså nogle objekter der har abboneret på eventet), så normal vil man skrive sådan her :

if(Something!=null)
  Something(this, e) // e er af typen SomethingEventArgs

Hvis vi nu siger, at du har angivet eventet på en klasse der hedder SomeControl, så vil du alle de steder hvor du har en forekomst af SomeControl kunne abbonnere på eventet Something ved :

someControl.Something += new SomethingEventHandler(someControl_Something);

Og handleren vil så kunne se sådan her ud :
private void someControl_Something(object sender, SomethingEventArgs e)
{
    // gør et eller andet
}

Jeg håber du sådan i det store og hele genkender systemet fra en almindelig knap eller lignende.

Det eneste der mangler for at du kan få sådan noget som ovenstående til at fungere er, at definere dit argument, men det er også lige ud af landevejen :

public SomethingEventArgs : System.EventArgs
{
}

Mere behøver du faktisk ikke, men når man opretter en ny argumenttype er det vanligvis fordi man vil fortælle et eller andet specielt med det, så det kunne være det skulle se sådan her ud :

public SomethingEventArgs : System.EventArgs
{
    private string extremelyImportantMessage;

    public string ExtremelyImportantMessage
    {
        get{return extremelyImportantMessage;}
    }

    public SomethingEventArgs(string extremelyImportantMessage)
    {
        this.extremelyImportantMessage = extremelyImportantMessage;
    }
}


Så tror jeg du har lidt at starte på ... vi kan skrives ved imorgen aften omkring det.
Avatar billede wired Nybegynder
29. juli 2004 - 21:22 #13
Hmm.. har selvfølgelig lige et par spørgsmål... Og så skriver jeg i vb.net men det skulle være til at forstå alligevel.
Avatar billede snepnet Nybegynder
29. juli 2004 - 22:53 #14
Spørg løs :o)
Avatar billede snepnet Nybegynder
30. juli 2004 - 00:53 #15
public class MyPage : Page
{
    // de her er så angivet på aspx-siden
    protected U1 userControl1;
    protected U2 userControl2;

    private void Page_Load(object sender, System.EventArgs e)
    {
    }

    override protected void OnInit(EventArgs e)
    {
        InitializeComponent();
        base.OnInit(e);
    }
   
    private void InitializeComponent()
    {   
        userControl1.Save += new SaveEventHandler(this.Save);
        this.Load += new System.EventHandler(this.Page_Load);
    }

    private void Save(object sender, System.EventArgs e)
    {
        userControl2.ShowSomething();
    }
}
Avatar billede snepnet Nybegynder
30. juli 2004 - 00:59 #16
// her er din delegate
public delegate void SaveEventHandler(object sender, System.EventArgs e);
Avatar billede snepnet Nybegynder
30. juli 2004 - 01:00 #17
// og to kontroller

public class U1 : UserControl
{
    // event du kan abbonnere på
    public event SaveEventHandler Save;

    protected override void CreateChildControls()
    {
        Button b = new Button();
        b.Text = "Gem";
        b.Click += new EventHandler(b_Click);
        base.CreateChildControls ();
    }

    // her fyres dit event
    private void b_Click(object sender, EventArgs e)
    {
        if(Save!=null)
            Save(this, new System.EventArgs());
    }
}

public class U2 : UserControl
{
    public void ShowSomething()
    {
        // gør et eller andet
    }
}
Avatar billede snepnet Nybegynder
08. august 2004 - 17:34 #18
Hej wired.... er vi færdige her, eller har du stadig spørgsmål ?
Avatar billede wired Nybegynder
09. august 2004 - 09:10 #19
Jeg arbejder stadig på forståelsen, men du har været til stor hjælp, send derfor et svar og pointene er dine.
Avatar billede wired Nybegynder
09. august 2004 - 09:11 #20
Mange tak for hjælpen...
Avatar billede snepnet Nybegynder
09. august 2004 - 09:14 #21
svar :o)
held og lykke med det - bare skriv hvis der er noget.
Mvh
Avatar billede wired Nybegynder
09. august 2004 - 09:21 #22
Det er jeg utrolig glad for at høre. Takker mange gange...
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