Sukram: Dynamische Steuerelemente

Hallo,

ich erzeuge dynamische Steuerelemente und möchte mit diesen arbeiten.

  
    public partial class Form1 : Form  
    {  
        int a = -1;  
  
        public void create_forms()  
        {  
            a += 1;  
  
  
            Button path1 = new Button();  
            path1.Text = "Path";  
            path1.Size = new Size(38, 21);  
            path1.Location = new Point(311, 25+(a*40));  
            path1.Tag = a;  
            path1.Click += new EventHandler(path1_Click);  
  
            TextBox path_value = new TextBox();  
            path_value.Name = "path_value";  
            path_value.Size = new Size(157, 20);  
            path_value.Location = new Point(148, 25 + (a * 40));  
  
            panel1.Controls.Add(path1);  
            panel1.Controls.Add(path_value);  
  
        }  
public Form1()  
        {  
            InitializeComponent();  
  
            panel1.AutoScroll = true;  
  
            create_forms(1);  
  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            create_forms();  
        }  
  
        private void path1_Click(object sender, EventArgs e)  
        {  
            //????  
        }  
  
        private void Form1_Load(object sender, EventArgs e)  
        {  
  
        }  
  
        private void panel1_Paint(object sender, PaintEventArgs e)  
        {  
  
        }  
}  
  

Mit diesem Code kann ich dynamisch eine Textbox und einen Button erzeugen.

Das Ganze sieht so aus:

-----------    ------
 |         |    |Path|
 -----------    ------
 -----------    ------
 |         |    |Path|
 -----------    ------
             .
             .
             .

Jetzt möchte ich, dass wenn ich auf den ersten "Path"-Button klicke z.B. der Text "Path-Button 1 geklickt" in der 1. TextBox erscheint.
Wenn der zweite Path-Button geklickt wird, soll das in der 2. TextBox passieren.
Über sender.tag kann ich schonmal nichts auslesen. Das wird mir in VisualStudio nicht angeboten.

Außerdem weiß ich nicht, wie ich auf die Textboxen zugreifen soll.

Gruß

Sukram

  1. Über sender.tag kann ich schonmal nichts auslesen. Das wird mir in VisualStudio nicht angeboten.

    sender ist vom Tap object, aber in deinem Fall steckt ein Button dahinter und der hat ein Tag. Caste sender als Button und du kannst drauf zugreifen.

    Außerdem weiß ich nicht, wie ich auf die Textboxen zugreifen soll.

    Die könntest du in ein Array stecken, auf das du dann mit einem Index zugreifst, der im Tag des Buttons steht.
    Oder du gibst dem Button direkt die Textbox als Tag.

    1. Über sender.tag kann ich schonmal nichts auslesen. Das wird mir in VisualStudio nicht angeboten.
      sender ist vom Tap object, aber in deinem Fall steckt ein Button dahinter und der hat ein Tag. Caste sender als Button und du kannst drauf zugreifen.

      Hallo,

      das hatte ich auch schon versucht:

      (Button)sender.tag

      aber VisualStudio bietet mir .Tag nicht an?!

      Sondern nur:
      Equal
      GetHashCode
      GetType
      ToString

      Gruß

      Sukram

      1. Hi!

        (Button)sender.tag
        aber VisualStudio bietet mir .Tag nicht an?!

        Entweder

        (sender as Button).Tag

        oder

        ((Button)sender).Tag

        Sondern nur:
        Equal
        GetHashCode
        GetType
        ToString

        Das zeugt davon, dass du offensichtlich immer noch beim object bist und noch nicht beim Button. Der . ist also stärker als der Typecast, weswegen du noch einmal klammern oder die andere Syntax verwenden musst.

        P.S. Das Wort "dynamisch" sollte man beim Programmieren vermeiden, finde ich, denn es beschreibt irgendwie alles und doch nichts.

        Lo!

        1. Hi,

          Entweder

          (sender as Button).Tag

          oder

          ((Button)sender).Tag

          super, jetzt funktioniert es.

          Außerdem weiß ich nicht, wie ich auf die Textboxen zugreifen soll.
          Die könntest du in ein Array stecken, auf das du dann mit einem Index zugreifst, der im Tag des Buttons steht.
          Oder du gibst dem Button direkt die Textbox als Tag.

          Könntest du das etwas genauer erklären?

          Ich befinde mich jetzt in:

            
          private void path1_Click(object sender, EventArgs e)  
                  {  
                      //????  
                  }  
          
          

          Wie kann ich da anstoßen, dass sich der Inhalt von:
          path_value.Text
          ändert?

          Das mit dem Index im Tag ist klar und kann ich dann ja mit
          ((Button)sender).Tag auslesen

          Nur mir fehlt der Weg um auf die TextBox zuzugreifen.

          1. Hi!

            Außerdem weiß ich nicht, wie ich auf die Textboxen zugreifen soll.

            Du benötigst eine Referenz darauf. Logisch, nicht? Wenn sie dir nicht wie im Falle von sender beim Ereignis mit übergeben wird, musst du sie anderswo ablegen oder eine bestehende Referenz irgendwo abholen.

            Abholen kannst du sie dir über die Controls-Collection des übergeordneten Containers. Da brauchst du aber ein Wiedererkennungsmerkmal, beispielsweise im Tag oder den Namen. Ansonsten musst du dir selbst einen geeigneten Platz schaffen, ein <String, Textbox>-Dictionary (wobei der String der Key ist und auch von anderem Typ sein kann, je nachdem, was du brauchst), ein Array, eine Liste, irgendwas anderes.

            Auf diesen Ablageplatz brauchst du natürlich auch wieder eine Referenz, die kannst du ja in das Eigenschaft des Forms ablegen.

            Lo!

            1. Abholen kannst du sie dir über die Controls-Collection des übergeordneten Containers. Da brauchst du aber ein Wiedererkennungsmerkmal, beispielsweise im Tag oder den Namen. Ansonsten musst du dir selbst einen geeigneten Platz schaffen, ein <String, Textbox>-Dictionary (wobei der String der Key ist und auch von anderem Typ sein kann, je nachdem, was du brauchst), ein Array, eine Liste, irgendwas anderes.

              Hi,

              habe es über:

                
              ((TextBox)panel1.Controls.Find("path_value", true).First()).Text = "Path-Button 1 geklickt";
              

              hinbekommen. In diesem Beispiel nur mal für die erste Textbox. Um die restlichen Textboxen einzubeziehen ist der Weg klar.

              Es ärgert mich etwas, dass ich das nicht alleine hinbekommen habe, denn mit Controls.Find hatte ich schon rumexperementiert, bevor ich hier gefragt habe, hatte es nur nicht gecastet.

              Vielen Dank für Eure Hilfe.

              Gruß

              Sukram

              1. Merk dir die Textboxen in einem Array, zum Beispiel im FormLoad. Dann kannst du mit dem Index drauf zugreifen.
                Ein Find würd ich persönlich zu unschön finden, schau dir mal die Zeile an. kapierst du in einer Woche längst nicht so schnell wie wenn du sowas machst:
                int index = ((Control)sender).Tag;
                TextBox meineBox = textboxArray[index];