2009-03-13 12 views
4

In meinem aktuellen Projekt verwende ich vier Rasteransichten in verschiedenen Registerkarten. Wie das System entwickelt hat, haben sie einige gemeinsame Methoden, z. B. zeigen eine benutzerdefinierte QuickInfo und ein Rechtsklick-Menü für wann in Zeilen.Wiederverwendung von Ereignishandlern in C#

Ich gehe jetzt durch eine Code-Reinigungsübung. Was ich unten sehe ist, dass ich jetzt vier Event-Handler habe, die dieselbe Methode aufrufen. Ist es in Ordnung, die Event-Handler so zu ändern, dass sie direkt auf GridMenu zeigen, wodurch der zusätzliche Code vermieden wird? Wird mir das später in der Entwicklung Probleme bereiten?

Offensichtlich im Moment verwende ich die standardmäßige even Handler-Namen.

private void grdEnquiriesLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdApplicantsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdApplicationsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void grdInterviewsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridMenu(sender, e); 
    } 

    private void GridMenu(object sender, GridMenuEventArgs e) 
    { 
     GridView view = (GridView)sender; 

     if (view.CalcHitInfo(e.Point).InRow) 
      popupMenu1.ShowPopup(Cursor.Position); 
    } 

Antwort

10

Erstellen Sie anstelle der direkten Registrierung unter GridMenu einen allgemeinen Ereignishandler mit dem Namen Grid_ShowGridMenu.

Registrieren Sie sich nur für denselben Ereignishandler für jedes Raster, anstatt einen separaten Ereignishandler pro Raster zu erstellen.

grdEnquiriesLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdApplicantsLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdApplicationsLevel1.ShowGridMenu += Grid_ShowGridMenu; 
grdInterviewsLevel1.ShowGridMenu += Grid_ShowGridMenu; 


private void Grid_ShowGridMenu(object sender, GridMenuEventArgs e) 
{ 
    GridMenu((GridView)sender, e.Point); 
} 

Statt nun sender, e direkt an GridMenu vorbei, passieren nur notwendig Werte GridMenu und die Unterschrift des GridMenu ändern, so kann es mehr wiederverwendbar sein.

private void GridMenu(GridView grid, Point hitPoint) 
{ 
    if (grid.CalcHitInfo(hitPoint).InRow) 
     popupMenu1.ShowPopup(Cursor.Position); 
} 
+0

@Rich B: Danke Rich B, ich habe gerade von diesen Backticks erfahren nachdem du deine Änderungen durchgelesen hast. – Sung

0

Solange der Ereigniscode für alle Steuerelemente generic ist dann diese Methode ist in Ordnung und sauber.

Wenn Sie beginnen, wichtige if/else zu haben oder Blöcke im Code zu wechseln, dann ist es vielleicht Zeit für ein Nachdenken.

+1

Wie kann sich das Wiederholen von 5 Mal "sauber" nennen? Es gibt keinen Grund, mehr als eine Ereignisbehandlungsmethode zu verwenden, die entweder die Arbeit selbst ausführt oder auf eine andere Methode mit einer anderen Signatur verweist. –

+0

Lesen Sie in der + ve. "... dann ist diese Methode in Ordnung und sauber .." bezieht sich auf @ petebob796 und sagt: "Ist es in Ordnung, die Event-Handler so zu ändern, dass sie direkt auf GridMenu verweisen ...". Du solltest das -ve nicht in einem Posting übernehmen, nur weil die Sprache nicht perfekt ist! – TFD

0

Sie sollten ein Benutzersteuerelement erstellen, das Ihr benutzerdefiniertes Raster kapselt. Auf diese Weise wird Ihr gesamtes Verhalten gekapselt und wiederverwendet.

+0

Was ist, wenn es nicht wiederverwendet werden muss? – TFD

+0

In diesem Fall wird es 4 Mal verwendet - daher die Code-Duplizierung. –

Verwandte Themen