2010-10-14 19 views
2

Je possède ce code C# d'énumérer les contrôles d'une instance de formulaire:Formulaire Énumérer Contrôles

private void button1_Click(object sender, EventArgs e) 
{ 
    textBox1.Text = ""; 

    Form2 form2 = new Form2(); 

    foreach (Control control in form2.Controls) 
    { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(control); 

     foreach (PropertyDescriptor property in properties) 
     { 
      textBox1.Text += (property.Name + Environment.NewLine); 
     } 
    } 
} 

Cette liste tous les noms de commandes d'un Dialogue2 formulaire dans une zone de texte. C'est ma tentative de reproduire ce code dans PowerShell:

$form = New-Object System.Windows.Forms.Form 

foreach($control in $form.Controls) 
{ 
    $properties = 
     [System.ComponentModel.TypeDescriptor]::GetProperties($control) 

    foreach($property in $properties) 
    { 
     $property.Name 
    } 
} 

Mais cela ne fonctionne pas. $ form.Control semble être vide, donc la boucle foreach n'est jamais entrée. Comment puis-je faire fonctionner le code C# ci-dessus dans PowerShell?

[modifier 1]

Le code ci-dessus a évidemment une forme sans contrôle sur elle. Ici est mis à jour le code PowerShell avec une forme qui a un bouton ajouté à ses contrôles collection, mais avec (apparemment) le même résultat de ne pas énumérer la collection Controls:

$form = New-Object System.Windows.Forms.Form 
$button = New-Object System.Windows.Forms.Button 
$form.Controls.Add($Button) 

$form.Controls.Count 

foreach($control in $form.Controls) 
{ 
    $properties = 
     [System.ComponentModel.TypeDescriptor]::GetProperties($control) 

    foreach($property in $properties) 
    { 
     $property.DisplayName 
    } 
} 

[modifier 2]

si i vérifier le type de propriété $:

foreach($property in $properties) 
{ 
    $property.GetType().FullName 
} 

GetType() retourne:

System.ComponentModel.PropertyDescriptorCollection

où je m'attendais à PropertyDescriptor.

Répondre

1

Vous avez juste besoin de manuellement .GetEnumerator() - Je ne sais pas pourquoi Powershell ne le déroule pas correctement.

$form = New-Object System.Windows.Forms.Form 
$button = New-Object System.Windows.Forms.Button 
$form.Controls.Add($Button) 

$form.Controls.Count 

foreach($control in $form.Controls) 
{ 
    $properties = 
     [System.ComponentModel.TypeDescriptor]::GetProperties($control) 

    foreach($property in $properties.GetEnumerator()) 
    { 
     $property.DisplayName 
    } 
} 
+0

Super! Merci beaucoup. –

2

Dans votre code C#, vous avez probablement une classe définie comme Form2 qui a des contrôles sur elle. Dans votre PowerShell, vous chargez un System.Windows.Forms.Form vanilla qui n'a aucun contrôle sur elle.

+0

Désolé, mauvais copié/collé. Je vais mettre à jour la question. –