2

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 を期待していた場所。

4

2 に答える 2

2

C# コードには、おそらく Form2 として定義されたクラスがあり、そこにコントロールがあります。あなたのパワーシェルでは、コントロールを持たないバニラ System.Windows.Forms.Form をロードしています。

于 2010-10-14T15:45:32.257 に答える
1

.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
    } 
}
于 2010-10-14T17:35:56.517 に答える