Toon posts:

[C#] Hoe opvragen welke objecten zich op een form bevinden?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Weet iemand hoe je kan opvragen welke aangemaakte object zich binnen een form bevinden? Ik heb na wat zoeken de volgende code gevonden:

code:
1
2
3
4
foreach (Control c in Controls)
{
         Console.WriteLine( c.Name );
}


Dit levert binnen mijn form het volgende op:

textBox1
button1

Nu is het zo dat ik op dat form nog meer objecten aanmaak. BV:
code:
1
2
3
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.ContextMenu contextMenuNotifyIcon;
private System.Windows.Forms.MainMenu mainMenu;


Deze worden helaas niet getoond in het lijstje. Weet iemand hoe ik alle objecten binnen een form kan opvragen?

Verwijderd

Verwijderd schreef op zaterdag 02 juli 2005 @ 02:29:

Nu is het zo dat ik op dat form nog meer objecten aanmaak. BV:
code:
1
2
3
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.ContextMenu contextMenuNotifyIcon;
private System.Windows.Forms.MainMenu mainMenu;


Deze worden helaas niet getoond in het lijstje. Weet iemand hoe ik alle objecten binnen een form kan opvragen?
De genoemde code maakt helemaal geen objecten aan, het declareert alleen wat variabelen. En zelf als je een object in de variabelen stoppen, dan staan de objecten nog steeds niet fysiek in het Form. Je zult ze echt aan een Form of een Control moeten toevoegen alvorens je ze gemakkelijk op wilt kunnen vragen.

En anders zou je alle objecten ook nog eens in bijvoorbeeld een Dictionary of ArrayList moeten stoppen.

Verwijderd

Topicstarter
Sorry ik had een verkeerd stukje code. Het had dit moeten zijn:

code:
1
2
3
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuNotifyIcon = new System.Windows.Forms.ContextMenu();
this.mainMenu = new System.Windows.Forms.MainMenu();



Deze objecten worden toch zo aangemaakt binnen je form? Wat is nou het verschil tussen bv. die textBox en notifyIcon? Ze bestaan toch allebei binnen het form? Dan zou je ze toch ook allebei moeten kunnen opvragen?

Verwijderd

Ze staan wel in de code van je form als zijnde code, maar ze worden nergens aan de controls van het form toegevoegd:
C#:
1
Controls.Add(je items hier)

[ Voor 9% gewijzigd door Verwijderd op 02-07-2005 03:06 . Reden: ff code tags omheen gegooid ]


Verwijderd

Topicstarter
Dat klopt maar, dat doe ik met de textbox1 ook niet.

Verwijderd

En je weet heel zeker dat de form designer dat niet zelf heeft gedaan? Dat gebeurt namelijk standaard als je op die manier een control toevoegt. En probeer het toch maar eens :)

Verwijderd

Topicstarter
Nou volgens mij niet. (als het niet buiten mijn gezichtsveld gebeurt) Ik weet niet of jij het ergens ziet staan maar, mijn complete code is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
            // 
            // FormMain
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(424, 313);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Menu = this.mainMenu;
            this.Name = "FormMain";
            this.Text = "Form1";
            this.ResumeLayout(false);

[ Voor 84% gewijzigd door Verwijderd op 02-07-2005 11:40 . Reden: Alleen relevate code overgelaten ]


Verwijderd

regel 154 en 155 :9

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op zaterdag 02 juli 2005 @ 02:55:
Sorry ik had een verkeerd stukje code. Het had dit moeten zijn:

code:
1
2
3
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuNotifyIcon = new System.Windows.Forms.ContextMenu();
this.mainMenu = new System.Windows.Forms.MainMenu();



Deze objecten worden toch zo aangemaakt binnen je form? Wat is nou het verschil tussen bv. die textBox en notifyIcon? Ze bestaan toch allebei binnen het form? Dan zou je ze toch ook allebei moeten kunnen opvragen?
Die objecten worden toegewezen aan properties van je form; ze worden echter niet aan de control-collection van je form toegevoegd.
Verwijderd schreef op zaterdag 02 juli 2005 @ 03:10:
En je weet heel zeker dat de form designer dat niet zelf heeft gedaan? Dat gebeurt namelijk standaard als je op die manier een control toevoegt. En probeer het toch maar eens :)
Als je een menu toevoegt aan je applicatie, dan wordt dat menu volgens mij ook niet aan de control collection van je form toegevoegd; kijk maar als je het visueel drag 'n dropt: het menu 'object' zie je ook niet op je form staan, maar staat onder je form.


Ow, enne TS, het is echt niet nodig om hier je volledige code te posten; meer dan de helft ervan is irrelevant, en dat maakt jouw post dus alleen maar minder aantrekkelijk om te lezen.

[ Voor 35% gewijzigd door whoami op 02-07-2005 09:55 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Sorry voor dat hele stuk code. Maar idd staat op regel 154 en op 155 dat ze toegevoegd worden aan de Controls. Bedankt voor dat inzicht _/-\o_

Maar is het helemaal niet mogelijk om via een andere manier uit te zoeken welke objecten er allemaal zijn. Door bv te kijken ofzo naar Parent of Child. Ik zoe eigenlijk het tegenovergestelde van FindForm(). Hiermee kan je van een object opvragen op welk form hij staat.

[ Voor 49% gewijzigd door Verwijderd op 02-07-2005 11:39 . Reden: Net wakker en bedenkt zich wat. ]


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 22-03 20:57

Skinny

DIRECT!

Met behulp van Reflection kan je een heel eind komen volgens mij :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        // lbControls en lbComponents zijn twee ListBoxes

        lbControls.Items.Clear();
        lbComponents.Items.Clear();
        

        // Doodnormale controls
        foreach( Control c in this.Controls )
        {
          lbControls.Items.Add(c.Name);
        }

        Type obj = this.GetType();

        // Andere componentjes opvragen. Dmv de BindingFlags kun je verder opgeven wat je wilt
        // terugkrijgen.

        System.Reflection.FieldInfo[] fields = obj.GetFields(
                  System.Reflection.BindingFlags.Instance | 
                  System.Reflection.BindingFlags.NonPublic);

        
        foreach( FieldInfo info in fields )
        {
          lbComponents.Items.Add(info.Name);
        }


HTH

SIZE does matter.
"You're go at throttle up!"


Verwijderd

Topicstarter
Kijk dat zoek ik. Harstikke bedankt!

_/-\o_

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Om met [rml]whoami in "[ C#] Aanmaken van object met een string ..."[/rml] te spreken: vaak is Reflection niet wat je wilt, en duidt het op een verkeerd design of het zoeken naar een verkeerde oplossing.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1