Avatar billede axboeg Nybegynder
26. oktober 2008 - 21:08 Der er 5 kommentarer og
1 løsning

Set Control fra anden namespace

Hej,

VS2008, Win Form App.

Hvordan styrer man et control fra et andet namespace? jeg har en Listbox på min mainform og jeg vil kunne ListBox.Items.Add... fra et andet namespace i en anden fil - har prøvet med Get/Set:

(main.cs)
public Boolean basketListSet
        {
            get { return basketList.Visible; }
            set { basketList.Visible = value; }
        }
(anothernamespace.cs)
main mySetting = new main();
mySetting.basketListSet = False;

Men dette virker naturligvis ikke? hvordan bliver denne tilgået.

Vh
Brian
Avatar billede aaberg Nybegynder
27. oktober 2008 - 12:48 #1
Grunden til at det ikke virker, er fordi du opretter en ny instans af main klassen. Når du da sætter BasketListCase propertien, er det på denne nye instans, og ikke på den instansen af dit main vindue som vises på skærmen.

For at gøre dette, bliver du nød til at overføre en reference til main. Først opretter en property på klassen i antohernamespace, som indeholder en instans af main. F.eks. sådan:

private main _mainForm;
public main MainForm
{
  get{return _mainForm;}
  set{_mainForm = value;}
}

når du opretter en instans af klassen i anothernamespace, skal du opdatere referencen til main:

MyClassInANotherNamespace instance = new MyClassInAnotherNamespace();
instance.MainForm = this;

Dette dur kun hvis du opretter instansen fra main.

Nu kan du kalde basketListSet propertien fra klassen i det andet namespace.
MainForm.BasketListSet = false;

Og så vil jeg lige nævne, at din problemstilling har intet at gøre med namespaces. Den har udelukkende at gøre med kommunikation imellem instanser af klasser.
Avatar billede axboeg Nybegynder
27. oktober 2008 - 21:33 #2
Tak for svaret - jeg undskylder, men jeg kan ikke rigtig få den ind på lystavlen.

Mærkeligt at dette er blevet så meget mere besværligt end Delphi hvor man jo bare bruger "uses".

Men jeg fandt ud af det med Namespace som du har ret i - det er kommunikation mellem klasser jeg har problemmer med.

Nu har jeg lavet et helt simpelt program:

(Form1.cs) - her er der smidt en label1 på fra designsiden:
namespace events
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Form1 _form;
        public Form1 MyForm
        {
            get { return _form; }
            set { _form = value; }
        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Hello";
        }
    }
}
(Class1.cs)
namespace events
{
    public class Class1
    {
        Class1 instance = new Class1();
        instance.  <--- denne findes ikke??

    }
}

Kan du hjælpe mig lidt videre?

PFT
Brian
Avatar billede aaberg Nybegynder
28. oktober 2008 - 09:49 #3
En nemmere måde end den jeg beskrev tidligere, er at have en statisk reference til din hovedform. Det kan gøres på følgende måde:

(Form1.cs) - her er der smidt en label1 på fra designsiden:
namespace events
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Instance = this;
        }

        private static _instance;
        public static Instance
        {
            get{return _instance;}
            private set{_instance = value;}
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Hello";
        }
    }
}

For at få fat i din label fra den anden klasse, bliver du først nød til at gøre den public. Dette gøres fra designeren, ved at sætte "Modifiers" til true i Property Vinduet.

Nu kan få fat i labelen på følgende måde:

(Class1.cs)
namespace events
{
    public class Class1
    {
        public void SomeMethod()
        {
            Form1.Instance.label1.Visible = false;
        }

    }
}

Denne måde at gøre det på, går godt så længe du kun har oprettet en instans af din hovedform. Samme fremgangsmåde dur ikke, hvis det f.eks. havde været en dialogboks som der kunne vises flere af ad gangen, da der jo kun kan være en reference til en instans af klassen i den statiske property.
Avatar billede aaberg Nybegynder
28. oktober 2008 - 09:49 #4
Rettelse:

(Form1.cs) - her er der smidt en label1 på fra designsiden:
namespace events
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Instance = this;
        }

        private static Form1 _instance;
        public static Form1 Instance
        {
            get{return _instance;}
            private set{_instance = value;}
        }
   
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Hello";
        }
    }
}
Avatar billede axboeg Nybegynder
28. oktober 2008 - 13:24 #5
Så spiller det! tak for det.

Selvom jeg læser tit om at man helst ikke vil have controls til at være public?? skal jeg vælge en helt anden løsning? i givet fald i hvilken retning?

Jeg kan ikke få lov til at tildele dig dine point?

Vh
Brian
Avatar billede aaberg Nybegynder
28. oktober 2008 - 13:48 #6
Jeg skal lægge et svar før du kan give mig point. Det kommer her.

Om man skal lave sine controls public eller ej!? Det kommer and på flere ting. Er dette et program som skal kunne udvides af andre ved hjælp af plugins? Hvis svaret til dette er nej, er der ingen problemer ved at gøre en control public.

Public controls giver 3. parts kode mulighed for at ændre på dem. Men hvis dit program ikke tillader 3. parts kode (Altså, at du ikke har implementeret en plugin mulighed), så giver det heller ingen problemer.
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