Вопрос

У меня есть этот код 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 с формой, в которой в коллекцию 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.

Это было полезно?

Решение

Вам просто нужно вручную .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
    } 
}

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top