Autor Beitrag
dubstep
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

Win XP, Win 7
C# (VS 2010)
BeitragVerfasst: So 10.04.11 11:59 
Gibt es eine Möglichkeit, diesen Code etwas "professioneller" aussehen zu lassen? Mein Ansatz/Idee wäre, dass man eine "allgemein gültige" Funktion hat, welche erkennt, dass zum Beispiel "pictureBox3" angeklickt wurde (diese Information, welche pictureBox nun angeklickt wurde, könnte man ja zum Beispiel aus der Location erhalten. Da jede pictureBox die selbe Größe hat (20x20) und diese aneinandergereiht sind ...). Im Prinzip will ich nur die Abhängigkeit einer bestimmten Zahl in dieser Funktion ändern. Die Funktion soll auf keine bestimmte pictureBox passen, sie sollte allgemein - egal ob für pictureBox1 oder pictureBox25 - gültig sein.
Bin für jede Idee dankbar!

Hier noch der oben beschriebene (viel zu umständliche) Code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1.Visible = false;
            pictureBox1red.Visible = true;
        }

        private void pictureBox1red_Click(object sender, EventArgs e)
        {
            pictureBox1red.Visible = false;
            pictureBox1.Visible = true;
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            pictureBox2.Visible = false;
            pictureBox2red.Visible = true;
        }

        private void pictureBox2red_Click(object sender, EventArgs e)
        {
            pictureBox2red.Visible = false;
            pictureBox2.Visible = true;
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {
            pictureBox3.Visible = false;
            pictureBox3red.Visible = true;
        }

        private void pictureBox3red_Click(object sender, EventArgs e)
        {
            pictureBox3red.Visible = false;
            pictureBox3.Visible = true;
        }
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 10.04.11 12:34 
Du kannst immer zwei Boxen die gleiche Eventfunktion für Click zuweisen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        private void pictureBox1Click(object sender, EventArgs e)
        {
            pictureBox1.Visible = sender == pictureBox1red;
            pictureBox1red.Visible = sender == pictureBox1;
        }
Damit ist der Code schon einmal nur noch halb so lang.

Dann könntest du das noch besser machen, indem du die Daten, was gerade angeklickt ist, separat in Variablen speicherst. Dann kannst du darüber den Status aktualisieren.

Du kannst z.B. ein Array mit drei Einträgen benutzen, in dem du den Status speicherst und auf den Index mit Hilfe der Eigenschaft Tag der jeweiligen pictureBox verweisen.

Für diesen Beitrag haben gedankt: dubstep
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 10.04.11 12:57 
Ich würde bei allen Boxen dasselbe Event nehmen und über Controls.Find(..) die jeweils passende "Partner"-Box suchen. Wenn es auf Performance ankommt, kann man das Ergebnis auch noch cachen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
dubstep Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

Win XP, Win 7
C# (VS 2010)
BeitragVerfasst: So 10.04.11 23:42 
Vielen Dank euch beiden!
Ich bin nun so weit, dass ich die Information über die jeweilige pictureBox erhalte - also wenn der User z.B. pictureBox3 anklickt, dann wird dies auch registriert und diese Information in einem string "selectwort" gespeichert.
"selectwort" hat dann zum Beispiel den Wert "pictureBox1" oder "pictureBox3" ... je nachdem welche pictureBox angeklickt wurde.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        private void InformationRequest(object sender, EventArgs e)
        {
            System.Windows.Forms.Control infoid;
            infoid = (Control)sender;
            string selectwort = infoid.Name;
        }


Nun würde ich gerne diese Information in die Funktion reinbringen - leider klappt dies nicht. Also das "selectwort_Click" nimmt er schon noch an, aber das "selectwort.Visible" schon nicht mehr. Es ist auch verständlich warum er dies nicht akzeptiert ... "selectwort" ist ja keine pictureBox - also kann ".Visible" auch nicht verwendet werden. Aber gibt es da vielleicht nicht eine Möglichkeit?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
 private void selectwort_Click(object sender, EventArgs e, string selectwort)
        {
            selectwort.Visible = false;
            selectwort.Visible = true;
        }
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 10.04.11 23:44 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde bei allen Boxen dasselbe Event nehmen und über Controls.Find(..) die jeweils passende "Partner"-Box suchen.
Darüber findest du ein Control über den Namen. Den zusätzlichen Parameter kannst du allerdings nicht für ein Click Event nutzen, woher sollte C# den auch nehmen, wenn es den Eventhandler aufruft? ;-)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 11.04.11 07:48 
Ich sehe das Problem gerade nicht, in 99% der Fälle dürfte die Name-Eigenschaft mit dem Variablennamen übereinstimmen. Wenn man dann noch ein bisschen diszipliniertist, schafft man auch die 100%.

Und dann kann man doch sowas machen (mit Buttons anstatt PictureBoxen getestet):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
                    private Dictionary<Button, Button> partners = new Dictionary<Button, Button>();

        private void button1_Click(object sender, EventArgs e)
        {

            var thisButton = (Button)sender;
            if (!partners.ContainsKey(thisButton))
            {
                var matchingButtons = this.Controls.Find(thisButton.Name.EndsWith("red") ? thisButton.Name.Substring(0, thisButton.Name.Length - "red".Length) : thisButton.Name + "red"true);
                if (matchingButtons.Length > 0)
                    partners[thisButton] = (Button) matchingButtons[0];

            }

            thisButton.Visible = false;
            partners[thisButton].Visible = true;
        }

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: dubstep
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 11.04.11 08:30 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Ich sehe das Problem gerade nicht, in 99% der Fälle dürfte die Name-Eigenschaft mit dem Variablennamen übereinstimmen.
@user profile iconChristian: Falls das missverständlich war: ;-)
Ich meinte meinen Post als Antwort auf die direkt vorhergehende Frage, nicht als Antwort für dich:
user profile icondubstep hat folgendes geschrieben Zum zitierten Posting springen:
Also das "selectwort_Click" nimmt er schon noch an, aber das "selectwort.Visible" schon nicht mehr. Es ist auch verständlich warum er dies nicht akzeptiert ... "selectwort" ist ja keine pictureBox - also kann ".Visible" auch nicht verwendet werden. Aber gibt es da vielleicht nicht eine Möglichkeit?
dubstep Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

Win XP, Win 7
C# (VS 2010)
BeitragVerfasst: Mo 11.04.11 21:31 
Tausend Dank! Das hat wunderbar geklappt.