Frage

Ich habe diese C # -Code aufzuzählen Kontrollen eines Formulars Beispiel:

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);
        }
    }
}

Diese listet alle Steuerelemente Namen eines Formulars Form2 in einem Text. Dies ist mein Versuch, diesen Code in Powershell zu reproduzieren:

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

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

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

Aber das funktioniert nicht. $ Form.Control scheint leer zu kommen, so dass die foreach-Schleife nie eingegeben wird. Wie kann ich die oben C # -Code Arbeit in Powershell?

machen

[Bearbeiten 1]

Der obige Code hat offensichtlich eine Form ohne Kontrollen darauf. Hier wird aktualisiert Powershell-Code mit einer Form, die eine Schaltfläche, um seine Kontrollen Sammlung hinzugefügt hat, aber mit (scheinbar) dem gleichen Ergebnis nicht die Controls-Auflistung aufzählt:

$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
    } 
}

[Bearbeiten 2]

wenn ich die $ Art der Immobilie überprüfen:

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

GetType () zurückgibt:

System.ComponentModel.PropertyDescriptorCollection

, wo ich erwartet PropertyDescriptor.

War es hilfreich?

Lösung

Sie müssen nur manuell .GetEnumerator () -. Ich bin mir nicht sicher, warum Powershell ist das nicht richtig abrollen

$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
    } 
}

Andere Tipps

In Ihrem C # -Code, haben Sie wahrscheinlich eine Klasse als Form2 definiert, die Kontrollen auf sich. In Ihrem Powershell laden Sie ein Vanille System.Windows.Forms.Form up, die nicht kontrolliert werden es gewohnt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top