2010-10-20 6 views
0

J'ai des classes configuration semblable à ceci:En utilisant de nombreuses classes dans l'interface graphique qui héritent d'une base

<DataContract()> _ 
Public MustInherit Class SystemTaskProcessBase 

    Public MustOverride ReadOnly Property Name() As String 
    Public MustOverride ReadOnly Property Description() As String 

    Public MustOverride Property Result() As SystemTaskResult 

    <DataMember()> _ 
    Private _TaskID As Integer = 0 
    Public Property TaskID() As Integer 
     Get 
      Return _TaskID 
     End Get 
     Set(ByVal value As Integer) 
      _TaskID = value 
     End Set 
    End Property 

End Class 

<DataContract()> _ 
Public Class RebootSystemTaskProcess 
    Inherits SystemTaskProcessBase 

    Private _Name As String = "Reboot System" 
    Public Overrides ReadOnly Property Name() As String 
     Get 
      Return _Name 
     End Get 
    End Property 

    Private _Description As String = "Task for the client to reboot itself internally." 
    Public Overrides ReadOnly Property Description() As String 
     Get 
      Return _Description 
     End Get 
    End Property 

    <DataMember()> _ 
    Public _Result As SystemTaskResult = SystemTaskResult.NotProcessed 
    Public Overrides Property Result() As SystemTaskResult 
     Get 
      Return _Result 
     End Get 
     Set(ByVal value As SystemTaskResult) 
      _Result = value 
     End Set 
    End Property 

End Class 

<DataContract()> _ 
Public Class DeleteFileSystemTaskProcess 
    Inherits SystemTaskProcessBase 

    Private _Name As String = "Delete File" 
    Public Overrides ReadOnly Property Name() As String 
     Get 
      Return _Name 
     End Get 
    End Property 

    Private _Description As String = "Task for the client to delete a local file." 
    Public Overrides ReadOnly Property Description() As String 
     Get 
      Return _Description 
     End Get 
    End Property 

    <DataMember()> _ 
    Public _Result As SystemTaskResult = SystemTaskResult.NotProcessed 
    Public Overrides Property Result() As SystemTaskResult 
     Get 
      Return _Result 
     End Get 
     Set(ByVal value As SystemTaskResult) 
      _Result = value 
     End Set 
    End Property 

    <DataMember()> _ 
    Private _File As FileInfo 
    Public Property File() As FileInfo 
     Get 
      Return _File 
     End Get 
     Set(ByVal value As FileInfo) 
      _File = value 
     End Set 
    End Property 

End Class 

-je utiliser ces classes sur le système client, mais il faut aussi être en mesure de créer ces « tâches "à travers une interface de gestion. Chaque classe (tâche) qui hérite de la base peut avoir ses propres propriétés propres à chaque classe, mais en même temps, partager les mêmes propriétés de classe de base communes. Par exemple, ce qui précède montre une tâche de redémarrage et une tâche de suppression de fichier, la tâche de suppression de fichier doit connaître le fichier à supprimer, de même qu'une propriété pour cela. Mais la tâche de redémarrage n'a pas besoin de cette propriété. Ainsi, lorsque l'application de gestion crée ces tâches, elle ne doit pas fournir de zone de texte pour la propriété de fichier pour la tâche de redémarrage. Il peut y avoir plus de tâches créées à une date ultérieure avec des propriétés complètement différentes. Comment donner à l'application de gestion WinForms un moyen d'énumérer chaque classe dans un ListView par exemple, et de permettre à l'utilisateur de créer ces tâches et de remplir les propriétés dynamiques que chaque classe aurait?

La fonctionnalité souhaitée consiste à créer un formulaire de tâche qui crée des contrôles dynamiques disponibles pour les propriétés selon les besoins, en fonction des propriétés publiques de chaque classe, mais en même temps, les propriétés de classe de base sont également disponibles.

Toutes les idées sont appréciées.

Merci, Scott

Répondre

0

Si vous avez besoin d'une solution hautement personnalisable et extensible, puis une façon de s'y prendre pour le faire serait approche axée sur la date. Dans l'un de mes précédents travaux, nous devions créer une interface utilisateur dynamique basée sur la préférence du client, dans laquelle le champ 1 était applicable à un client, mais la même chose n'était pas nécessaire pour un autre. L'extension de cette approche à votre question, vous devez avoir des tables DB

TasksTable with following columns 
1.TaskId 
2.TaskName 
3.ClassName (you will use reflection to create an instance of it) 

Une autre table avec les champs réels pour les tâches. Appelons cela TaskFields pour le moment.

TaskFields Table 
1. TaskFieldId 
2. Property (You can create another field to store the Name if you need to) 
3. Enabled (bit) 
4. SpecialFormat <if you need to apply this and customize it based on some preference) 

Ce sont des tables assez petites. Chargez-les lorsque l'application démarre. Dans votre application, liez votre ListBox au champ TaskName dans TasksTable. Lorsqu'un élément spécifique est sélectionné, créez dynamiquement des contrôles basés sur les valeurs de la table TaskFields pour l'élément sélectionné. Créez la classe basée sur le champ ClassName et associez créer des liaisons aux contrôles générés.

Ceci est complexe, mais l'avantage que vous obtenez est que vous pouvez activer/désactiver les contrôles pour apparaître.

EDIT: Si vous envisagez d'utiliser l'approche des attributs, le suivi peut s'avérer utile. Sur la base de vos exemples, vous marquez déjà les propriétés dont vous avez besoin en tant que Datamember. Vous n'avez donc pas besoin de définir d'attribut personnalisé, à moins que vous n'ayez d'autres propriétés qui ne seront pas utilisées pour la saisie par l'utilisateur mais qui ont elles-mêmes marqué DataMember à d'autres fins.

Dim type As Type = GetType(yourClass) 
Dim properties As PropertyInfo() = type.GetProperties() 
Dim neededProperties = (From [property] In propertiesLet attributes = DirectCast([property].GetCustomAttributes(GetType(DataMemberAttribute), False), Attribute()) Where attributes.Count() > 0[property]).ToList() 
+0

Merci pour votre réponse. J'essaie vraiment de garder cela en dehors d'une base de données en ce moment. Après avoir posté ma question, j'ai commencé à lire les attributs personnalisés pour les classes et les champs et ensuite être capable de lire ces valeurs d'indicateur pour déterminer si ce champ devrait avoir un contrôle créé pour lui ou non. Je pense que c'est essentiellement la même chose que ce que vous suggérez, en éliminant simplement le besoin de base de données. – ScottN

+0

@ScottN. Voir Modifier pour utiliser la réflexion pour obtenir les propriétés nécessaires. – SKG