フォームコントロールを列挙します
-
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);
}
}
}
これは、テキストボックス内のフォームフォーム2のすべての制御名をリストします。これは、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ループは入力されません。 PowerShellで上記のC#コードを機能させるにはどうすればよいですか?
編集1
上記のコードには明らかに、コントロールがないフォームがあります。コントロールコレクションにボタンが追加されたフォームを備えた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)
{
$property.DisplayName
}
}
編集2
$プロパティタイプを確認した場合:
foreach($property in $properties)
{
$property.GetType().FullName
}
getType()RETURNS:
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では、バニラシステムをロードしています。Windows.Forms.Formは、コントロールがありません。
所属していません StackOverflow