Avatar billede lasserasch Juniormester
02. marts 2007 - 08:29 Der er 4 kommentarer og
1 løsning

Referere til funktioner på den form hvor ens usercontrol ligger.

Hejsa.

Jeg har 1 form. På denne form har jeg forskellige usercontrols.

I koden til mine usercontrols kunne jeg godt tænke mig at kalde diverse voids som ligger på min form 1.

Men jeg kan ikke rigtig finde ud af at referere til den form som usercontrollen er kaldt fra.


Hvordan gør man det?



F.eks. hvis jeg fra : usercontrol1 som ligger på form1 ville kalde : void test1(), som ligger i koden på form1.

Det må da kunne lade sig gøre ik'?


/Lasse
Avatar billede crazysnap Seniormester
02. marts 2007 - 09:47 #1
Hej lasserasch!

Det kan man sagtens ja og der er flere måder at gøre det på. Man kan jo f.eks. give alle usercontrols 'form1' med ind som argument og gemme den i en member variabel eller man kan lave en accessor i usercontrols'ne som assigner 'form1' til en member variabel.

Jeg og exemplificeret det for dig nedenfor via noget simpelt kode:


class MyForm : Form
{
    public MyForm()
    {
        this.Width = 400; this.Height = 300;

       
        //Der to måder her at opstætte referencen
       
        //1) Kaste den med ind i constructoren:
        //MyUserControl myCtrl = new MyUserControl(this);
       
        //2) Bruge default konstruktoren og sæt den op bagefter via en accessor:
        MyUserControl myCtrl = new MyUserControl();

        //Bruge accessoren til at sætte referencen til MyForm i usercontrolen
        myCtrl.SetMyFormRef = this;


        this.Controls.Add(myCtrl);
    }

    public void test1()
    {
        MessageBox.Show("Denne metode er kaldt fra en usercontrol");
    }
}

class MyUserControl : UserControl
{
    MyForm m_myFormReference;

    public MyForm SetMyFormRef
    {
        set { m_myFormReference = value; }
    }

    //Constructor, skal have MyForm som parameter
    public MyUserControl(MyForm myForm) : this()
    {
        this.m_myFormReference = myForm;
    }

    public MyUserControl()
    {
        this.Width = 300; this.Height = 100;
        this.BackColor = System.Drawing.Color.LightGray;

        Button btn = new Button();
        btn.Width = 200; btn.Height = 25;
        btn.Text = "Click";
        btn.Click += new EventHandler(btn_Click);
        this.Controls.Add(btn);
    }


    void btn_Click(object sender, EventArgs e)
    {
        if (m_myFormReference != null)
        {
            m_myFormReference.test1();
        }
    }
}


Når der klikkes på knappen i usercontrol'en kaldes test1() metoden fra MyForm.


Håber det var det du søgte! :)


Mvh.

- Snap
Avatar billede lasserasch Juniormester
02. marts 2007 - 10:18 #2
Fandt selv en løsning.

gjorde sådan her :

Lavede en private Control C1 for hver usercontrol. Herudover lavede jeg en public void i mine usercontrols :

public void init(Control C)
{
C1 = C;
}

Fra min form1 gjorde jeg så følgende under load af formen.

Usercontrol1.Init(TextBox1);
Usercontrol2.Init(TextBox1);
osv osv....

Så kunne jeg fra hvert Usercontrol bare sige : C1.Text = "bla bla bla"; og så blev min textbox som lå på form1 opdateret korrekt!

/Lasse
Avatar billede crazysnap Seniormester
02. marts 2007 - 10:25 #3
Ja, hvis det kun var textboxen fra form1 du skulle bruge er det en mulig løsning! :)


Held og lykke med det! :)


Mvh.

- Snap (husk at snuppe pointene selv så spørgmålet bliver lukket)
Avatar billede lasserasch Juniormester
02. marts 2007 - 10:31 #4
Bare smid et svar, så får du points! Din løsning er nok en jeg vil bruge lidt senere i det program jeg er ved at lave!

/Lasse
Avatar billede crazysnap Seniormester
02. marts 2007 - 10:37 #5
Så skidt da! :)


Tak for dem, og skriv endelig hvis der opstår andre problemer!


Mvh.

- Snap :)
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