2009-08-03 8 views
2

J'utilise Generics avec un contrôle ListView dont la définition classe initiale ressemble à ceci:Generics ListView contrôle personnalisé

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(); 
     } 
    } 
} 

Voici mon fichier de concepteur:

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 
} 

Ce que je veux faire est pour créer une bibliothèque de contrôle Windows et j'ai réussi à le faire, mais le problème se produit lorsque je ne peux pas ajouter la DLL à la boîte à outils. Je ne sais pas exactement pourquoi je ne peux pas faire ça. Je pensais que tous les contrôles Windows Forms implémenter l'interface IComponent qui est une exigence pour ajouter des éléments à la boîte à outils. Est-ce parce qu'il y a un paramètre de type dans la définition de la classe?

+1

Peut-être l'absence d'un constructeur public sans paramètre? – Zyphrax

Répondre

3

Le concepteur déteste:

  • génériques
  • choses avec abstract base de classes

Même si cela fonctionne à l'exécution, vous allez probablement pas à l'obtenir pour travailler dans la IDE. Pardon. Peut-être envisager une classe non générique avec une propriété Type; qui est à peu près le meilleur que vous allez faire ...

BTW, CustomListView<T> et CustomListView sont complètement différentes classes. Vous avez 2 classes, pas un.

2

Vous ne pouvez pas utiliser des contrôles génériques (contrôle spécialisé par le biais de génériques) dans le concepteur. [Je me souviens avoir lu que c'était une décision de conception de l'équipe VS, mais je ne trouve pas la référence.]

Pour ObjectListView J'ai utilisé un modèle d'adaptateur pour fournir un accès typé à un contrôle ListView.

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 
} 

et vous l'utiliser comme ceci:

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

Ou, au lieu d'écrire tout ce que vous-même, vous pouvez simplement utiliser ObjectListView :)

0

Il est possible d'obtenir une maison à mi-chemin - J'ai un contrôle HierarchicalDataSource qui est défini dans une classe générique et la façon dont je l'obtiens dans la boîte à outils est en créant une implémentation concrète mais seulement une ligne avec les types définis. Compiler le projet dans une DLL puis ajouter à la boîte à outils de cette DLL me donne l'élément de la boîte à outils.