2009-06-24 5 views
5

Ich möchte einige Code, den ich schrieb, um einige Funktionen zu einem Datagridview hinzufügen wiederverwenden. Ich möchte, dass die standardmäßigen Eigenschaften und Ereignisse von datagridview verfügbar gemacht werden, sodass ich keine neue benutzerdefinierte Komponente erstellen wollte. Also habe ich versucht, eine Unterklasse zu schreiben, was gut funktioniert. Mir ist aber auch eingefallen, dass ich eine Standalone-Utility-Klasse schreiben könnte, die eine Datagridview im Konstruktor aufnimmt und auf die gleiche Weise aufruft. z.B.Dienstprogrammklasse vs Unterklasse. NET-Steuerelemente

public class 
MyGrid 
{ 
    private DataGridView m_dg; 

    public MyGrid(DataGridView dg) 
    { 
     m_dg = dg; 
     m_dg.RowHeadersVisible = false; 
     m_dg.SortCompare += new DataGridViewSortCompareEventHandler(m_dg_SortCompare); 
    } 

    void m_dg_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     // do custom sorting here 
    } 
} 

so irgendwo im Start meiner app würde ich

MyGrid g1 = new MyGrid(dataGridView1); 
MyGrid g2 = new MyGrid(dataGridView2); 

nennen und so weiter. irgendwelche Nachteile für diesen Ansatz? Es sieht so aus, als ob der Code weitgehend identisch ist, der Unterschied liegt darin, wie Sie das erweiterte Raster instanziieren (ziehen Sie ein Unterklasse - Steuerelement in das Formular und ziehen Sie eine einfache Datagrid - Ansicht und rufen Sie den obigen Code auf)

Antwort

1

Der einzige Nachteil einer Dienstprogrammklasse ist, dass Sie die Designerunterstützung verlieren. Das heißt, wenn Sie das Steuerelement von der Unterklasse ableiten, wenn Sie es dem Designer hinzufügen, werden alle Änderungen, die Sie im Konstruktor des geerbten Steuerelements vornehmen, im Designer angezeigt. Wenn Sie darüber hinaus einige Eigenschaften hinzufügen möchten, werden diese im Eigenschaftsfenster angezeigt und bieten dadurch noch mehr Flexibilität. Wenn Designer-Unterstützung für Sie jedoch keine Rolle spielt, sehe ich keine anderen Nachteile für eine Dienstprogrammklasse.

3

In Auf lange Sicht wird eine Dienstprogrammklasse wartungsfreundlicher sein als ein Unterklassen-Steuerelement, es sei denn, Sie tun etwas Wesentlicheres, um DataGridView zu erweitern, als das Sortieren zu ändern.

Ihr Ansatz für die Dienstprogrammklasse (DataGridView im Konstruktor verwenden) ist ein solider Ansatz.

1

Wenn Sie C# 3 verwenden, kann extension methods einen Blick wert sein. Es sieht so aus, als ob du einem Typ ein Verhalten hinzufügst, von dem du wünscht, dass es außerhalb der Box existiert.

static class GridExtMethods 
    { 
     public static void SortAsICommand(this MyGrid grid) 
     { 
      //grid.Prop = value; possible 
      grid.Sort += MyCustomSort; 
     } 
     static void MyCustomSort(object sender, SortEventArgs evtArgs) 
     { 
      Console.WriteLine("Sort {0} and {1}", evtArgs.First, evtArgs.Second); 
     } 
    } 

....

static void Main() 
{ 
    var grid = new MyGrid(10,20); 
    grid.SortAsICommand(); 

    //grid.RaiseEvent(); do something that raises the event 
}