26. oktober 2008 - 21:08Der 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.
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.
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??
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();
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.
(Form1.cs) - her er der smidt en label1 på fra designsiden: namespace events { public partial class Form1 : Form { public Form1() { InitializeComponent();
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.
Synes godt om
Ny brugerNybegynder
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.