Перечисление элементов управления формой
-
30-09-2019 - |
Вопрос
У меня есть этот код 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, которая не имеет никаких элементов управления.