سؤال

لدي رمز 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 في مربع نص. هذه هي محاولتي لإعادة إنتاج هذا الرمز في 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 مع نموذج يحتوي على زر يضاف إلى مجموعة عناصر التحكم الخاصة به ، ولكن مع (على ما يبدو) النتيجة نفسها لعدم تعداد مجموعة عناصر التحكم:

$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.

هل كانت مفيدة؟

المحلول

تحتاج فقط إلى.

$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 الخاص بك ، تقوم بتحميل نظام الفانيليا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top