質問

フォームインスタンスのコントロールを列挙するためのこの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は、コントロールがありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top