Autor |
Beitrag |
dubstep
      
Beiträge: 72
Win XP, Win 7
C# (VS 2010)
|
Verfasst: 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:
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.04.11 12:34
Du kannst immer zwei Boxen die gleiche Eventfunktion für Click zuweisen: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 72
Win XP, Win 7
C# (VS 2010)
|
Verfasst: 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.
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?
C#-Quelltext 1: 2: 3: 4: 5:
| private void selectwort_Click(object sender, EventArgs e, string selectwort) { selectwort.Visible = false; selectwort.Visible = true; } |
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.04.11 23:44
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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):
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.04.11 08:30
|
|
dubstep 
      
Beiträge: 72
Win XP, Win 7
C# (VS 2010)
|
Verfasst: Mo 11.04.11 21:31
Tausend Dank! Das hat wunderbar geklappt.
|
|
|