none
array mit event RRS feed

  • Frage

  • Hey,

    Ich möchte ein Spielfeld aus Pictureboxen 10x10 erstellen.

    und jede PictureBox soll mehrere Events enthalten, die aber alle die gleiche Funktion haben.

    private void Level1_Load(object sender, EventArgs e)
            {
                int counter=1;
                int x, y;
    
                PictureBox[] Feld = new PictureBox[100];
    
                for (x = 1; x != 10; x++)
                {
                    for (y = 1; y != 10; y++)
                    {
                        Feld[counter] = new PictureBox();
                        Feld[counter].Image = Properties.Resources.Feld1;
                        Feld[counter].Location = new Point(Feld[counter].Location.X + 20, Feld[counter].Location.Y);
                        Feld[counter].Name = "Feld_" + x + "_" + y ;
                        Feld[counter].Size = new Size(20, 20);
                        Feld[counter].SizeMode = System.Windows.Forms.PictureBoxSizeMode.Normal;
                        Feld[counter].MouseMove+= new EventHandler(this.Feld_MouseMove);
                        Controls.Add(Feld[counter]);
    
                        counter++;
                    }
                    y = 1;
                }
             }

    Wie realisiere ich nun für jede PictureBox eine eventmethode daraus:

    Feld[counter].MouseMove+= new EventHandler(this.Feld_MouseMove);

    ?

    Donnerstag, 19. Juni 2014 21:17

Antworten

  • Hallo,
    ergänzend zu Stefan:
    Wenn dir eine Methodensignatur nicht klar ist, klicke in "Feld_MouseMove" und drücke Strg + Punkt [.]. In dem erscheinenden Menü kannst du dir dann die Methode mit der richtigen Signatur erstellen lassen.


    Der sender-Parameter enthält die auslösende PictureBox. Wenn du dann noch die Koordinaten jeder PictureBox in der Tag-Eigenschaft speicherst (braucht man für nichts anderes), kannst du einfach die Koordinaten bestimmen. (Das Array selbst muss dafür direkt in der Klasse liegen, nicht in Level1_Load.)

    Beim erstellen:

    Feld[counter].Tag = new Point(x,y);
    Das auslesen von x und y:
    var p=(Point)(sender as PictureBox).Tag;
    var x=p.X;
    var y=p.Y;

    Ich empfehle dir außerdem ein 2D Array von PictureBoxen zu verwenden. Dadurch kannst du die Koordinaten einfacher einer PB zuordnen:
    PictureBox[,] Feld =new PictureBox[10,10];
    Beim Zuweisen kannst du dann direkt mit x und y arbeiten und musst keinen Zähler hoch zählen.

    Auch kannst du x und y direkt im Schleifenkopf deklarieren:

    for(int x=0;x<10;++x)
      for(int y=0;y<10;++y)
    Dadurch brauchst du y nicht immer zurück zu setzen.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Kalicronic Freitag, 20. Juni 2014 13:32
    Donnerstag, 19. Juni 2014 21:55
    Moderator

Alle Antworten

  • Hi,

    wo ist denn deine Methode "Feld_MouseMove"? Die musst Du schon in der Klasse haben, wenn Du sie verwenden willst.

    Wenn Du nicht weißt, wie die Methodensignatur aussehen soll:

    private void Feld_MouseMove( object sender, System.Windows.Forms.MouseEventArgs e )
    {
        ...
    }

    Siehe dazu auch:

      http://msdn.microsoft.com/de-de/library/system.windows.forms.control.mousemove.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 19. Juni 2014 21:34
    Moderator
  • Hallo,
    ergänzend zu Stefan:
    Wenn dir eine Methodensignatur nicht klar ist, klicke in "Feld_MouseMove" und drücke Strg + Punkt [.]. In dem erscheinenden Menü kannst du dir dann die Methode mit der richtigen Signatur erstellen lassen.


    Der sender-Parameter enthält die auslösende PictureBox. Wenn du dann noch die Koordinaten jeder PictureBox in der Tag-Eigenschaft speicherst (braucht man für nichts anderes), kannst du einfach die Koordinaten bestimmen. (Das Array selbst muss dafür direkt in der Klasse liegen, nicht in Level1_Load.)

    Beim erstellen:

    Feld[counter].Tag = new Point(x,y);
    Das auslesen von x und y:
    var p=(Point)(sender as PictureBox).Tag;
    var x=p.X;
    var y=p.Y;

    Ich empfehle dir außerdem ein 2D Array von PictureBoxen zu verwenden. Dadurch kannst du die Koordinaten einfacher einer PB zuordnen:
    PictureBox[,] Feld =new PictureBox[10,10];
    Beim Zuweisen kannst du dann direkt mit x und y arbeiten und musst keinen Zähler hoch zählen.

    Auch kannst du x und y direkt im Schleifenkopf deklarieren:

    for(int x=0;x<10;++x)
      for(int y=0;y<10;++y)
    Dadurch brauchst du y nicht immer zurück zu setzen.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Kalicronic Freitag, 20. Juni 2014 13:32
    Donnerstag, 19. Juni 2014 21:55
    Moderator
  • Ouh man ich glaube es war einfach schon ein wenig spät, auf 1, 2 Sachen hätte ich auch selber kommen können. >.<

    Vielen dank für die denk Anstöße.

    Freitag, 20. Juni 2014 13:32