Label als Vorlage benutzen



  • Hi all,

    ich hab eine eigentlich dumme frage ich will ein Objekt Label als Vorlage haben und das in einen Array kopieren. Das müsste doch so gehen

    Label[] label = new Label[20];
    for (Int32 i = 0; i < 20; i++)
    {
        label[i] = new Label();
        label[i] = labelOrginal;
        label[i].Visible = true;
    }
    

    Hmm…. Aber irgendwie zeichnet er mir nur einmal das Label in meinen Form.

    Gruß
    streav



  • oh vergessen zu schreiben das ich die alle untereinander positioniere also nicht selbe stelle. ^^



  • Guten Morgen,

    1. Die setzt keine Positionen -> Er malt sie immer an die gleiche Stelle
    2. Musst du den Label einen Control übergeben
    3. Hier mal ein code:

    System.Windows.Forms.Label[] labels = new Label[20];
                //Zufalls positionen (damit er den label nicht immer 
                //wieder an die gleiche stelle malt
                System.Random rand = new System.Random();
                foreach (System.Windows.Forms.Label label in labels)
                {
                    int x = rand.Next(300);
                    int y = rand.Next(300);
                    label.Location = new System.Drawing.Point(x, y);
                    label.Text = "Dies und Das";
                    label.Visible = true;
                    //Hier wird das label einem panel hinzugefügt
                    panel.Controls.Add(label);
                }
    

    Hoffe ich konnt dir helfen 🙂

    Helfer



  • meins sieht so aus bekomm trotzdem nur eins

    GroupBox groupBox = new GroupBox();
    groupBox.Text = "Test Box";
    groupBox.Location = new Point(12, 12);
    
    Label[] label = new Label[20];
    
    for (Int32 i = 0; i < 20; i++)
    {
         label[i] = new Label();
         label[i] = labelOrginal;
         label[i].Visible = true;
    }
    
    label[0].Text = "Label 1: ";
    label[0].Location = new Point(6, 22 + (fac * 1));
    
    label[1].Text = "Label 2: ";
    label[1].Location = new Point(6, 22 + (fac * 2));
    // alle anderen labels noch.......
    
    groupBox.Controls.AddRange(label);
    panel.Controls.Add(groupBox);
    

    hmmm..... 😕 😕

    Gruß streav



  • Servus,

    das liegt daran, dass du nicht das Objekt kopierst, sondern nur die Referenz übergibts. Das ist ein bisschen knifflig mit den Controls. Vor knapp einem Jahr bin ich auf das gleiche Problem gestoßen. Ich habe mir einfach eine Methode gebastelt (kopiert / geklaut k.a.), welche einfach ein neues Object des Typs erstellt und alle schreibbaren Eigenschaften kopiert.

    Bsp.:

    private void DoMooh()
    {
        Label original = new Label();
        Label[] list = new Label[5];
    
        for ( int i = 0; i < 5; i++ )
        {
            list[i] = this.CloneObject(original) as Label;
            list[i].Text = string.Format("Test {0}", i);
            list[i].Location = new Point(10, 20 * i);
        }
    
        this.Controls.AddRange(list);
    }
    
    private object CloneObject(object obj)
    {
        Type type = obj.GetType();
        System.Reflection.PropertyInfo[] properties = type.GetProperties();
    
        object o = type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, obj, null);
    
        foreach ( System.Reflection.PropertyInfo propertyInfo in properties )
        {
            if( propertyInfo.CanWrite )
                propertyInfo.SetValue(o, propertyInfo.GetValue(o, null), null);
        }
    
        return o;
    }
    

    Das wäre jetzt eine Lösung. Aber es fuhren bestimmt noch weitere Wege zu deinem Ziel....

    mfg
    Hellsgore



  • Bei nem Label mag das jetzt unproblematisch sein, aber das ist kein Deep Copy und könnt bei komplexen Objekten um einiges kniffliger sein das zu kopieren.





  • hellsgore: mit deinem Beispiel läuft es recht gut leider ist der Effekt aber hin mit dem original. Also ich wollte ein Original Label haben das, Größe und sonstiges vorgibt bei deiner Lösung gehen die Informationen bei mir verloren. Also bekomm nur die Standart Labels als Kopie.

    simon.gysi: hmm.... wenn ich das richtig verstehe soll ich doch so einsetzen.

    label[i] = ObjectCopier.Clone<Label>(labelOrginal);
    

    Der fliegt bei mir dann immer hier raus.

    if (!typeof(T).IsSerializable)
    {
         throw new ArgumentException("The type must be serializable.", "source");
    }
    


  • Wen dieses automatisierte kopieren per Reflection nicht geht, dann musst dir halt ne Funktion selber schreiben die manuell alle für dich interessanten Properties kopiert.

    Anders gehts nicht. .Net kennt keinen integrierten Mechanismus für ein Deep Copy. Die Lösung mit dem serialisieren geht ja auch nur wenn die Klasse als serialisierbar gekennzeichnet ist, und dass sind die GUI Klassen berechtigterweise nicht.


Anmelden zum Antworten