Перечислять элементы управления формы - PullRequest
2 голосов
/ 14 октября 2010

У меня есть этот код C # для перечисления элементов управления экземпляра формы:

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

Здесь перечислены все имена элементов управления Form2 в TextBox. Это моя попытка воспроизвести этот код в 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
    } 
}

Но это не работает. $ form.Control кажется пустым, поэтому цикл foreach никогда не вводится. Как сделать так, чтобы вышеуказанный код C # работал в PowerShell?

[править 1]

Приведенный выше код, очевидно, имеет форму без элементов управления. Вот обновленный код PowerShell с формой, в которую Button добавлен в коллекцию Controls, но с (по-видимому) тем же результатом отсутствия перечисления коллекции 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
    } 
}

[править 2]

если я проверю тип $ свойства:

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

GetType () возвращает:

System.ComponentModel.PropertyDescriptorCollection

где я ожидал PropertyDescriptor.

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

В вашем коде на C # у вас, вероятно, есть класс, определенный как Form2, в котором есть элементы управления.В вашей PowerShell вы загружаете ванильный System.Windows.Forms.Form, который не имеет никаких элементов управления.

1 голос
/ 14 октября 2010

Вам просто нужно вручную. GetEnumerator () - я не уверен, почему Powershell не разворачивает это правильно.

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