Form インスタンスのコントロールを列挙する次の 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);
}
}
}
これは、TextBox 内のフォーム form2 のすべてのコントロール名を一覧表示します。これは、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]
上記のコードには、明らかにコントロールのないフォームがあります。Controls コレクションに Button が追加されたフォームを使用して更新された PowerShell コードを次に示しますが、(一見) 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]
$property タイプをチェックすると:
foreach($property in $properties)
{
$property.GetType().FullName
}
GetType() は次を返します。
System.ComponentModel.PropertyDescriptorCollection
PropertyDescriptor を期待していた場所。