C# InvokeMember auf Control.Controls.Add?
Ich will threadübergreifend ein Control zu einem anderen hinzufügen. Das ist mein Code:
private delegate void AddControlThreadSafeDelegate(Control newControl, Control parent);
public static void AddControlThreadSafe(Control newControl, Control parent)
{
if (newControl == null) return;
if (parent == null) return;
if (parent.InvokeRequired)
{
parent.Invoke(new AddControlThreadSafeDelegate(AddControlThreadSafe),
new object[] { newControl, parent });
}
else
{
parent.GetType().InvokeMember("Controls.Add", BindingFlags.InvokeMethod, null, parent, new object[] { newControl });
}
}
Es kommt immer der folgende Fehler:
System.MissingMethodException: "Die Methode "System.Windows.Forms.FlowLayoutPanel.Controls.Add" konnte nicht gefunden werden."
Ich habe einmal nur die InvokeMember Funktion geändert und anstatt "Controls.Add", "Hide" als name geschrieben und newControl entfernt. Da kam der Fehler nicht.
Wie beseitige ich den Fehler?
1 Antwort
Vom Beitragsersteller als hilfreich ausgezeichnet
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
C Sharp, Programmiersprache, Visual Studio
Das FlowLayoutPanel besitzt keinen Member namens "Controls.Add". Es gibt allerhöchstens ein Property Controls, welches aufrufbar wäre.
So eine Implementation dürfte klappen:
private void AddControl(Control parent, Control control)
{
if (parent == null || control == null)
{
return;
}
if (InvokeRequired)
{
Invoke(AddControl, new object[] { parent, control });
return;
}
parent.Controls.Add(control);
}
Ja das hat geklappt. parent.Controls.Add(control); wird trotzdem im thread von parent ausgeführt und nicht in dem thread, der AddControl das erste mal aufruft, oder?