(ich habe nicht alles im Detail durchgelesen).
Aber wie wäre es mit einem ganz anderen Ansatz.
Mit einem ContinueWith.
https://msdn.microsoft.com/de-de/library/dd537612(v=vs.110).aspx
Die Objekte würden sich dann selber für den nächsten Prozesschritt anmelden sobald sie verfügbar sind.
Mach den Designer mal im Debugger auf.. damit Du eine Ahnung hast wieso es knallt...
Hier hatte ich das mal beschrieben: UserControl kann im Designer nicht hinzugefügt werden
Du könntest das Zielform im Code so ändern dass es von Form erbt... dann scheint das kopieren ja zu funktionieren.
Nach dem kopieren änderst Du die Form wieder so ab, dass die wieder von Deiner Baseclass erbt.
Hallo herbivore
Danke für den Hinweis.
Habe ich sofort angepasst.
Gruss
Programmierhans
RangeCheck-Extension für IComparable:
Eine kurze generische ExtensionMethode um zu prüfen ob sich ein Wert innerhalb / ausserhalb oder auf der Grenze befindet.
public static class Extensions
{
public static RangeCheck IsInRange<T>(this T pValue, T pBorder1, T pBorder2) where T: IComparable
{
return (RangeCheck)(Math.Sign(pBorder1.CompareTo(pBorder2)) == 0 ?
Math.Abs(Math.Sign(pValue.CompareTo(pBorder1))) + 1 :
Math.Abs(Math.Sign(pValue.CompareTo(pBorder1)) + Math.Sign(pValue.CompareTo(pBorder2))));
}
}
public enum RangeCheck
{
Inside = 0,
Border = 1,
Outside = 2
}
TestCode:
private void Test()
{
int border1 = 3;
int border2 = 7;
System.Diagnostics.Debug.WriteLine("RealBorder (3-7)");
for (int value = 1; value < 10; value++)
{
System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
}
border1 = 5;
border2 = 5;
System.Diagnostics.Debug.WriteLine("EqualBorder (5)");
for (int value = 1; value < 10; value++)
{
System.Diagnostics.Debug.WriteLine("{0}={1}", value, value.IsInRange(border1, border2));
}
}
}
Ausgabe:
RealBorder 3-7
1=Outside
2=Outside
3=Border
4=Inside
5=Inside
6=Inside
7=Border
8=Outside
9=Outside
EqualBorder (5)
1=Outside
2=Outside
3=Outside
4=Outside
5=Border
6=Outside
7=Outside
8=Outside
9=Outside
Edit: herbivore hat natürlich Recht... (Math.Sign eingebaut)
Range Check IComparable Extension
Hi,
Bei deinen Einschränkungen fällt mir dann somit auch nur eines ein:
Implementiere die Schnittstelle vollständig - und wenn es gar nicht anders möglich ist wirfst du bei Aufruf der Methode eine "NotSupportedException".
--> NotImplementedException 😃 Ansonsten sehe ich das auch so wie Du.
Tritt das noch auf wenn This.Invokerequired um && this.Handle != Intptr.Zero ergänzt ?
Herzlich willkommen.
Bitte als erstes dies hier beachten:
[Hinweis] Wie poste ich richtig?
Dann stellst Du konkrete Fragen.
Gruss
Programmierhans
Hallo Sebastian
Das mit dem Google für faule ist jeweils eher als Hilfe gedacht (ist doch bequem wenn man die Suche nicht selber tippen muss)... War sicher nicht böse gemeint.
Das mit dem ReferenceConverter... wie schon geschrieben schau mal welcher TypeConverter auf dem IComponent ist... und dann dessen Base... und schon haste den gefunden 😃
Sich in das Designerverhalten eigener Controls einzuarbeiten ist hart ... aber mit der Zeit verstehst Du da auch immer mehr...
Viel Spass beim experimentieren
Gruss
Programmierhans
Meiner Meinung nach fährst Du aber besser wenn Du die inneren Klassen von Component ableiten lässt (Dann brauchst Du auch den ReferenceConverter nicht... und kriegst gratis den Designer-Support)
Also in etwa so:
public class MyClassA : System.Windows.Forms.Panel
{
private IContainer components;
private MyClassB _Property1 = new MyClassB();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public MyClassB Property1 { get{return this._Property1;} private set{this._Property1=value;} }
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.components.Add(_Property1);
}
}
public class MyClassB:Component
{
private IContainer components;
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.components.Add(_Property1);
}
private string _Name = "myClassB";
public string Name { get{return this._Name;} set{this._Name=value;} }
private MyClassC _Property1 = new MyClassC();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public MyClassC Property1 { get{return this._Property1;} private set{this._Property1=value;} }
private BindingList<MyClassC> _Test=new BindingList<MyClassC>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public BindingList<MyClassC> Test { get{return this._Test;} private set{this._Test=value;} }
}
public class MyClassC:Component
{
private string _Name = "myClassC";
public string Name { get { return this._Name; } set { this._Name = value; } }
}
Schau Dir mal auf dem Interface IComponent vorhandenen Attribute an...