Aufzählen Form Controls
-
30-09-2019 - |
Frage
Ich habe diese C # -Code aufzuzählen Kontrollen eines Formulars Beispiel:
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);
}
}
}
Diese listet alle Steuerelemente Namen eines Formulars Form2 in einem Text. Dies ist mein Versuch, diesen Code in Powershell zu reproduzieren:
$form = New-Object System.Windows.Forms.Form
foreach($control in $form.Controls)
{
$properties =
[System.ComponentModel.TypeDescriptor]::GetProperties($control)
foreach($property in $properties)
{
$property.Name
}
}
Aber das funktioniert nicht. $ Form.Control scheint leer zu kommen, so dass die foreach-Schleife nie eingegeben wird. Wie kann ich die oben C # -Code Arbeit in Powershell?
machen[Bearbeiten 1]
Der obige Code hat offensichtlich eine Form ohne Kontrollen darauf. Hier wird aktualisiert Powershell-Code mit einer Form, die eine Schaltfläche, um seine Kontrollen Sammlung hinzugefügt hat, aber mit (scheinbar) dem gleichen Ergebnis nicht die Controls-Auflistung aufzählt:
$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
}
}
[Bearbeiten 2]
wenn ich die $ Art der Immobilie überprüfen:
foreach($property in $properties)
{
$property.GetType().FullName
}
GetType () zurückgibt:
System.ComponentModel.PropertyDescriptorCollection
, wo ich erwartet PropertyDescriptor.
Lösung
Sie müssen nur manuell .GetEnumerator () -. Ich bin mir nicht sicher, warum Powershell ist das nicht richtig abrollen
$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
}
}
Andere Tipps
In Ihrem C # -Code, haben Sie wahrscheinlich eine Klasse als Form2 definiert, die Kontrollen auf sich. In Ihrem Powershell laden Sie ein Vanille System.Windows.Forms.Form up, die nicht kontrolliert werden es gewohnt haben.