2017-11-30 5 views
0

Ich habe einen kleinen Menüleisten-Artikel, wo ich eine Fülle von Tasten habe, die verschiedene Formen aktivieren.Optimierung einer Wiederholung

Der Code für eine Taste wäre dies:

Form B1 = new Form1(); 
    private void Button1_Click(object sender, EventArgs e) 
     { 
      if (B1.Visible == false) 
      { 
       B1 = new Form1(); 
      } 

      B1.Visible = true; 
      B1.Activate(); 
     } 

Ich habe auch eine Maus Unter- und lassen Event:

private void Button1_MouseEnter(object sender, EventArgs e) 
    { 
     Button1.Text = "Something prdy intriguing"; 
    } 
    private void Button1_MouseLeave(object sender, EventArgs e) 
    { 
     Button1.Text = "Hi"; 
    } 

Und ein Tooltip: Jetzt

private void Tooltips() 
{ 
ToolTip forB1 = new ToolTip(); 
forB1.SetToolTip(button1, "21.11.17"); 
} 

Stellen Sie sich vor, ich brauche ungefähr 8 Knöpfe für 8 verschiedene Formen, das bedeutet, dass ich alle diese wieder und einen Gewinn wiederholen muss, Zeit verschwenden und aufnehmen muss viel Platz im Code.

Kann ich diese trotzdem komprimieren? Dies ist sehr außerhalb meiner Welt, ich bin mir nicht sicher, wo ich anfangen soll zu optimieren.

+0

Sie können dies viele verschiedene Möglichkeiten in Bezug auf die Menüeinträge tun, zum Beispiel zeigen sie alle auf den gleichen Event-Handler, verwenden Sie eine switch() {case:}, um den Meunitem-Namen zu prüfen und von dort – MethodMan

Antwort

1

Eine Möglichkeit ist, dies alles zu einer Funktion bewegen:

public void AttachMenuStripButtonHandlers(
    Button btn, 
    Form form, 
    string enterText, 
    string leaveText, 
    string tooltip) { 

    btn.Click += (sender, args) => { 
     form.Visible = true; 
     form.Activate(); 
    }; 
    btn.MouseEnter += (sender, args) => { 
     btn.Text = enterText; 
    }; 
    btn.MouseLeave += (sender, args) => { 
     btn.Text = leaveText; 
    }; 
    new ToolTip().SetToolTip(btn, tooltip); 
} 

Und für jede Taste Aufruf wie folgt:

AttachMenuStripButtonHandlers(Button1, B1, "on enter", "on leave", "tooltip"); 
+0

Nur zur Klarstellung, Sie sagen, dass die AttachMenuStripButtonHandlers-Methode für jede Schaltfläche im Konstruktor des Formulars aufgerufen werden müsste? –

+1

@MoonMoo wo immer der Autor das jetzt macht. Wenn er das im Formular-Designer macht, dann ja - im Konstruktor des Formulars. – Evk

+0

Hmm, das klappt zwar, aber deine Klickfunktion funktioniert nicht richtig, du kannst im Wesentlichen neue Formulare öffnen, aber wenn du das Formular schließt oder entsorgst, kannst du es nicht mehr öffnen, du musst seinen Typ aufgeben, denke ich .. – Flame

0

Zum zweiten Teil Ihrer Frage, Sie könnten etwas tun, wie dies

private void Button_MouseEnter(object sender, EventArgs e) 
{ 
    ((Button)sender).Text = "Something prdy intriguing"; 
} 
private void Button_MouseLeave(object sender, EventArgs e) 
{ 
    ((Button)sender).Text = "Hi"; 
} 

Sie müssen alle Tasten gleiche Event-Handler befestigen.

+0

Hmm, das ist ein gute Lösung, aber ich fühle mich tatsächlich wie dieser Teil insgesamt ist nicht sehr flexibel für die Optimierung, da, wenn ich verschiedene Texte für jede Schaltfläche möchte ich immer noch wiederholen müssen, aber gibt es möglicherweise eine Möglichkeit, es in eine Funktion zu schreiben? wie button1.mouseEnter.text = "dies und das"? Das würde bedeuten, dass ich nicht zum Designer reisen müsste, um das Ereignis zu veröffentlichen. – Flame

+0

Sie könnten Ihr benutzerdefiniertes Textobjekt in der Tag-Eigenschaft des Buttons behalten und es in Event-Handlern ziehen. So etwas - button1.Tag = (EnterText = "Mein Text eingeben", LeaveText = "Mein Text"). –

0

Also ich ein bisschen hier @ Evk Code bin zu stehlen, aber im Wesentlichen funktioniert dies die wie ich es wollte.

public void ButtonHandlers(Type NewForm) 
    { 

      NewButton.Click += (sender, args) => 
      { 
       Form TheNewMain = (Form)Activator.CreateInstance(NewForm); 
       if (TheNewMain.ShowDialog() != DialogResult.Cancel) 
       { 
        TheNewMain.Activate(); 
       } 
      }; 

Im Wesentlichen, was ich hinzugefügt wurde, anstatt das Formular zu bekommen, ich habe die Art zu erhalten, da das, was ich will, ist, dass, wenn ein Formular sichtbar ist, wird er es nicht zweimal öffnen, geht durch EVKS Code öffnet Ja, aber bei näherer Betrachtung ist es entsorgt und es kann keine neue Instanz davon erschaffen.

In Code muss ich für typeof(formName) in als NewForm

Dank Evk fragen Sie einfach!

Verwandte Themen