2009-08-03 9 views
2

Ich verwende Generics mit einem Listview-Steuerelement, dessen Anfangsklassendefinition sieht wie folgt aus:Generics Listview Custom Control

namespace BaseControlLibrary 
{ 
    public partial class CustomListView<T> : System.Windows.Forms.ListView 
    { 
     // Custom fields, properties, methods go here 

     public CustomListView(List<T> data) 
     { 
      _columnInfo = new Dictionary<int, string>(); 
      _columnIndex = 0; 

      _lvwItemComparer = new ListViewItemComparer(); 
      this.ListViewItemSorter = _lvwItemComparer; 

      InitializeColumnNames(); 
      BindDataToListView(data); 

      this.Invalidate(); 
     } 
    } 
} 

Hier ist meine Designer-Datei:

partial class CustomListView 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    //protected override void Dispose(bool disposing) 
    //{ 
    // if (disposing && (components != null)) 
    // { 
    //  components.Dispose(); 
    // } 
    // base.Dispose(disposing); 
    //} 

    #region Component Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     components = new System.ComponentModel.Container(); 
     // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    } 

    #endregion 
} 

Was ich tun möchte, ist um eine Windows-Steuerelementbibliothek zu erstellen, und ich habe es erfolgreich getan, aber das Problem tritt auf, wenn ich die DLL der Toolbox nicht hinzufügen kann. Ich bin mir nicht ganz sicher, warum ich das nicht machen kann. Ich dachte, dass alle Windows Forms-Steuerelemente die IComponent-Schnittstelle implementieren, die zum Hinzufügen von Elementen zur Toolbox erforderlich ist. Liegt es daran, dass der Typparameter Teil der Klassendefinition ist?

+1

Vielleicht das Fehlen eines öffentlichen parameterlosen Konstruktors? – Zyphrax

Antwort

3

Der Designer hasst:

  • Generika
  • Dinge mit abstract Basis-Klassen

Auch wenn es zur Laufzeit arbeitet, sind Sie wahrscheinlich nicht bekommen es in der Arbeit IDE. Es tut uns leid. Betrachten Sie vielleicht eine nicht-generische Klasse mit einer Type Eigenschaft; das war die beste, was Sie tun ...

btw, CustomListView<T> und CustomListView sind ganz andere Klassen. Sie haben 2 Klassen, nicht eine.

2

Sie kann nicht verwenden generische Steuerelemente (d. H. Kontrolle durch Generika) im Designer. [Ich scheine das Lesen zu erinnern, dass es sich um eine Design-Entscheidung von der VS-Team war, aber ich kann die Referenz nicht gefunden.]

Für ObjectListView ich ein Adapter-Muster verwendet typisierten Zugriff auf ein Listview-Steuerelement zur Verfügung zu stellen.

public class TypedObjectListView<T> where T : class 
{ 
    /// <summary> 
    /// Create a typed wrapper around the given list. 
    /// </summary> 
    public TypedObjectListView(ObjectListView olv) { 
     this.olv = olv; 
    } 

    public void BindTo(IList<T> objects) { 
     // Manipulate the attached ListView here 
    } 

    // plus whatever other methods you want 
} 

und würden Sie es wie folgt verwenden:

TypedObjectListView<Person> tlist = 
    new TypedObjectListView<Person>(this.listView1); 
tlist.BindTo(myListofPeople); 

Oder statt alles selbst zu schreiben, könnten Sie einfach Object verwenden :)

0

Es ist möglich, ein auf halben Weg Haus zu bekommen - Ich habe ein HierarchicalDataSource-Steuerelement, das in einer generischen Klasse definiert ist, und die Art, wie ich es in der Toolbox anzeigen lasse, besteht darin, eine konkrete Implementierung zu erstellen, wenn auch nur ein Liner mit den definierten Typen. Kompilieren des Projekts in eine DLL und dann Hinzufügen von Toolbox aus dieser DLL gibt mir den Toolbox-Eintrag.