PictureBox gemeinsamme Events abfangen, und erkennen welche es gesendet hat ?



  • Hallo, hab da mal eine Grundsatzfrage.

    Ich habe 130 kleine PictureBoxen auf einer Form, mit einer PictureBox wo ein Plan
    angezeigt wird. Mit den 130 kleinen zeige ich 2 verschiedene pgn files an, welche
    einen Status symbolisieren. Wenn ich alle PictureBoxen markiere und dann ein Event
    einfüge, kann ich dann in diesen gemeinsamen Event, auch feststellen welche das ist und
    das ganze dann in einen switch-case Block abarbeiten. Will nicht wirklich 130 Events
    einfügen, wo ein und dasselbe das gleiche macht.

    Oder bin ich komplet auf dem Holzweg ? Wie würdet Ihr das machen ?

    mfg



  • Du machst das schon richtig, die entsprechende box kommt dann als Sender mit dem Event rein.



  • Hallo CSL, ok Danke für die Bestätigung, und rasche Abtwort. Habs jetzt am laufen.

    Habs im Event so gemacht:

    private void pictureBox2_Click(object sender, EventArgs e)
            {
                PictureBox pb = new PictureBox();
    
                pb = (PictureBox)sender;
    
                switch (pb.Name)
                {
                    case "pictureBox2":
                        MessageBox.Show("Eins");
                        break;
                    case "pictureBox3":
                        MessageBox.Show("Zwei");
                        break;
                    case "pictureBox4":
                        MessageBox.Show("Drei");
                        break;
                    default:
                        MessageBox.Show("pictureBox not found!");
                        break;
    
                }
    
            }
    

    Fand aber auser den Namen keinen Index also "int" zum abfragen.
    Funktionieren tuts jetzt, aber gibts da keinen bessere löhsung dafür ?
    Denk da an ein Object Array oder so.

    mfg



  • Du hast doch nicht etwa die 130 PictureBoxen von Hand auf dem Formular plaziert?

    Am besten du erzeugst die PictureBoxen von Hand und speicherst sie in einer dynamischen List<>.

    Und da jedes Windows-Control Ressourcen (interne Handles etc.) verbraucht, wäre es besser, die Bilder direkt zu zeichnen (d.h. im Paint-Event des Formulars mittels e.Graphics.DrawImage()).

    Hier ein paar Links zum Nachlesen:
    http://www.mycsharp.de/wbb2/thread.php?threadid=21211
    http://www.mycsharp.de/wbb2/thread.php?threadid=21782

    Als Ergänzung:
    http://www.mycsharp.de/wbb2/thread.php?threadid=29081

    Desweiteren ist

    PictureBox pb = new PictureBox();
    
    pb = (PictureBox)sender;
    

    völlig überflüssig: erst eine neue PictureBox erzeugen und die Variable dann wieder zu überschreiben.
    Da ich da jetzt schon öfter bei Anfängern gesehen habe, frage ich mich, wer bzw. welches Buch das so lehrt?



  • Hallo TH69, Erstens möchte ich Dir für die tollen Links danken, hab noch
    nicht alles gelesen, aber das passt genau zu meinem Projekt.

    Um zu deiner Frage zu kommen, ja, ich habe die 130 PictureBoxes von Hand
    auf dem Formular plaziert. Da ich darunter eine andere PictureBox habe, wo
    eine Art Lageplan enthalten ist. Ich wolte nicht zuerst 130 x,y Koordinaten
    ermitten und das ganze dann auch noch manuell coden. Die 130 PictureBoxen haben
    aber nur eine Größe von 21 x 26 pixel.
    Nichts desto trotz dachte ich das währe die schnellste Methode 🙄

    Ach ja, habe das jetzt ausprobiert und den code Abschnitt so abgeendert:

    PictureBox pb = (PictureBox)sender;
    

    Das hast Du ja gemeint oder ?

    Zu meinem besseren Verständniss, was ist der Nachteil wenn ich das object in
    diesen Fall mit new zuerst erzeuge ?

    Danke nochmal für die Links

    mfg



  • PictureBox ;o) schrieb:

    Um zu deiner Frage zu kommen, ja, ich habe die 130 PictureBoxes von Hand
    auf dem Formular plaziert. Da ich darunter eine andere PictureBox habe, wo
    eine Art Lageplan enthalten ist. Ich wolte nicht zuerst 130 x,y Koordinaten
    ermitten und das ganze dann auch noch manuell coden. Die 130 PictureBoxen haben
    aber nur eine Größe von 21 x 26 pixel.
    Nichts desto trotz dachte ich das währe die schnellste Methode 🙄

    nope

    for(int y = 0; y < 13; y++)
    {
      for(int x = 0; x < 10; x++)
      {
        PictureBox ^pb = gcnew PictureBox();
        pb->Location = gcnew Point(x,y);
        pb->Size = gcnew Size(21, 26);
        // ...
        this->Controls->Add(pb);
      }
    }
    

    ungetestet

    hand, mogel



  • Hallo mogel!

    Ja da hast Du schon Recht. Aber das funktionert nur wenn die x,y koordinaten
    in einen Raster (dammit meine ich 0,1 0,2 0,3 oder 1,1 usw.) sind.
    Meine Koordinaten sind aber Kreuz und Quer über das Form verteilt.

    Das heißt ich hätte zuerst manuell die x,y, Koordinaten am Form suchen müßen,
    dann hätte ich die in einen Coordinaten Array abgelegt, und dann so ähnlich
    die objekte dynamisch anlegen konnen. Ich dachte mir aber, wenn ich schon manuell
    suchen muss, kann ich sie auch gleich direkt setzten. Ist in diesen Fall ja kein
    Mehraufwand. Vom Programmieren gefällt mir deine Löhsung Persönlich ja auch
    besser.

    mfg



  • Schau Dir mal TableLayoutPanel oder FlowLayoutPanel an...


Anmelden zum Antworten