2010-07-27 7 views
0

Ce qui suit est ma classe personnalisée, avec des collections. Mon application est une application MDI avec la possibilité d'ouvrir un formulaire "Programme" plusieurs fois pour plusieurs programmes et je veux utiliser la classe ProgramBudget mais je veux que toutes les "sous-classes" dans le budget du programme soient contenues dans le formulaire ProgramBudget classe.C# Confusion de collection de classe personnalisée

J'ai des problèmes mais où les sous-classes continuent à se IntelliSense référencés dans recursivelly (ie: ProgramBudget.ParticipantTypeBudget.ParticipantTypeBudget.ParticipantTypeBudget ...)

Quel est le problème avec cette classe et comment fonctionnent i avec elle, la classe personnalisée est ci-dessous:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace IPAM_NSF_Financials.Application_Classes 
{ 
    public class ProgramBudget 
    { 
     internal string strProgramCode; 
     private string strActualTravelSourceRefCode; 
     private string strActualExpenseSourceRefCode; 
     private string strProgramBudgetComment; 
     private string strParticipantComment; 
     private decimal decInitTravel; 
     private decimal decInitLodging; 
     private decimal decInitStipend; 
     private decimal decRemTravel; 
     private decimal decRemLodging; 
     private decimal decRemStipend; 
     private decimal decPartTypeTravel; 
     private decimal decPartTypeExpenses; 
     private decimal decPartPrimTravelBudget; 
     private decimal decPartPrimExpenseBudget; 
     private decimal decPartPrimRegFee; 
     private decimal decActualTravelAir; 
     private decimal decActualTravelGround; 
     private decimal decActualTravelMisc; 
     private decimal decActualExpenseLodging; 
     private decimal decActualExpenseCatering; 
     private decimal decActualExpenseMisc; 
     private int nProgramBudgetID; 
     private int nParticipantTypeBudgetID; 
     private int nParticipantBudgetHDRID; 
     private int nParticipantBudgetHDRCommentID; 
     private int nParticipantBudgetDTLID; 
     private int nParticipantBudgetDTLExpenseID; 
     private int nParticipantBudgetDTLTravelID; 
     private int nPartType; 
     private int nParticipant; 
     private int nActualTravelSource; 
     private int nActualExpenseSource; 

     public int ProgramBudgetID 
     { 
      get { return nProgramBudgetID; } 
      set { nProgramBudgetID = value; } 
     } 

     public string ProgramCode 
     { 
      get { return strProgramCode; } 
      set { strProgramCode = value; } 
     } 

     public decimal InitialTravel 
     { 
      get { return decInitTravel; } 
      set { decInitTravel = value; } 
     } 

     public decimal InitialLodging 
     { 
      get { return decInitLodging; } 
      set { decInitLodging = value; } 
     } 

     public decimal InitialStipend 
     { 
      get { return decInitStipend; } 
      set { decInitStipend = value; } 
     } 

     public decimal RemainingTravel 
     { 
      get { return decRemTravel; } 
      set { decRemTravel = value; } 
     } 

     public decimal RemainingLodging 
     { 
      get { return decRemLodging; } 
      set { decRemLodging = value; } 
     } 

     public decimal RemainingStipend 
     { 
      get { return decRemStipend; } 
      set { decRemStipend = value; } 
     } 

     public string ProgramBudgetComment 
     { 
      get { return strProgramBudgetComment; } 
      set { strProgramBudgetComment = value; } 
     } 

     public class ParticipantTypeBudget : ProgramBudget 
     { 
      public int ParticipantTypeBudgetID 
      { 
       get { return nParticipantTypeBudgetID; } 
       set { nParticipantTypeBudgetID = value; } 
      } 

      public int ParticipantType 
      { 
       get { return nPartType; } 
       set { nPartType = value; } 
      } 

      public decimal ParticipantTypeTravel 
      { 
       get { return decPartTypeTravel; } 
       set { decPartTypeTravel = value; } 
      } 

      public decimal ParticipantTypeExpenses 
      { 
       get { return decPartTypeExpenses; } 
       set { decPartTypeExpenses = value; } 
      } 
     } 

     class ParticipantTypeBudgets : CollectionBase 
     { 
      public void Add(ParticipantTypeBudget partTypeBudgetObject) 
      { InnerList.Add(partTypeBudgetObject); } 

      public void Remove(int Index) 
      { InnerList.RemoveAt(Index); } 

      public ParticipantTypeBudget Item(int Index) 
      { return (ParticipantTypeBudget)InnerList[Index]; } 
     } 

     public class ParticipantPrimaryBudget : ProgramBudget 
     { 
      public int ParticipantBudgetHDRID 
      { 
       get { return nParticipantBudgetHDRID; } 
       set { nParticipantBudgetHDRID = value; } 
      } 

      public int ParticipantID 
      { 
       get { return nParticipant; } 
       set { nParticipant = value; } 
      } 

      public string ParticipantBudgetComment 
      { 
       get { return strParticipantComment; } 
       set { strParticipantComment = value; } 
      } 

      public decimal ParticipantPrimaryTravelBudget 
      { 
       get { return decPartPrimTravelBudget; } 
       set { decPartPrimTravelBudget = value; } 
      } 

      public decimal ParticipantPrimaryExpenseBudget 
      { 
       get { return decPartPrimExpenseBudget; } 
       set { decPartPrimExpenseBudget = value; } 
      } 

      public decimal ParticipantPrimaryRegFee 
      { 
       get { return decPartPrimRegFee; } 
       set { decPartPrimRegFee = value; } 
      } 
     } 

     public class ParticipantActualTravelBudget : ProgramBudget 
     { 
      public int ParticipantBudgetDTLID 
      { 
       get { return nParticipantBudgetDTLID; } 
       set { nParticipantBudgetDTLID = value; } 
      } 

      public int ParticipantBudgetDTLTravelID 
      { 
       get { return nParticipantBudgetDTLTravelID; } 
       set { nParticipantBudgetDTLTravelID = value; } 
      } 

      public int FundingSource 
      { 
       get { return nActualTravelSource; } 
       set { nActualTravelSource = value; } 
      } 

      public string ReferenceCode 
      { 
       get { return strActualTravelSourceRefCode; } 
       set { strActualTravelSourceRefCode = value; } 
      } 

      public decimal Air 
      { 
       get { return decActualTravelAir; } 
       set { decActualTravelAir = value; } 
      } 

      public decimal Ground 
      { 
       get { return decActualTravelGround; } 
       set { decActualTravelGround = value; } 
      } 

      public decimal Miscellaneous 
      { 
       get { return decActualTravelMisc; } 
       set { decActualTravelMisc = value; } 
      } 
     } 

     class ParticipantActualTravelBudgets : CollectionBase 
     { 
      public void Add(ParticipantActualTravelBudget partActTravelBudgetObject) 
      { InnerList.Add(partActTravelBudgetObject); } 

      public void RemoveAt(int Index) 
      { InnerList.RemoveAt(Index); } 

      public ParticipantActualTravelBudget Item(int Index) 
      { return (ParticipantActualTravelBudget)InnerList[Index]; } 
     } 

     public class ParticipantActualExpensesBudget : ProgramBudget 
     { 
      public int ParticipantBudgetDTLID 
      { 
       get { return nParticipantBudgetDTLID; } 
       set { nParticipantBudgetDTLID = value; } 
      } 

      public int ParticipantBudgetDTLExpenseID 
      { 
       get { return nParticipantBudgetDTLExpenseID; } 
       set { nParticipantBudgetDTLExpenseID = value; } 
      } 

      public int FundingSource 
      { 
       get { return nActualExpenseSource; } 
       set { nActualExpenseSource = value; } 
      } 

      public string ReferenceCode 
      { 
       get { return strActualExpenseSourceRefCode; } 
       set { strActualExpenseSourceRefCode = value; } 
      } 

      public decimal Lodging 
      { 
       get { return decActualExpenseLodging; } 
       set { decActualExpenseLodging = value; } 
      } 

      public decimal Catering 
      { 
       get { return decActualExpenseCatering; } 
       set { decActualExpenseCatering = value; } 
      } 

      public decimal Miscellaneous 
      { 
       get { return decActualExpenseMisc; } 
       set { decActualExpenseMisc = value; } 
      } 
     } 

     class ParticipantActualExpenseBudgets : CollectionBase 
     { 
      public void Add(ParticipantActualExpensesBudget partActExpensesBudgetObject) 
      { InnerList.Add(partActExpensesBudgetObject); } 

      public void RemoveAt(int Index) 
      { InnerList.RemoveAt(Index); } 

      public ParticipantActualExpensesBudget Item(int Index) 
      { return (ParticipantActualExpensesBudget)InnerList[Index]; } 
     } 
    } 
} 
+0

Avons-nous vraiment besoin de voir tout ce code? Avec aucune question? C'est pourquoi j'ai rejeté votre question. –

+7

Quelqu'un a besoin de connaître les propriétés automatiques! – Aren

+1

Sérieusement - regardez dans les propriétés auto. Cela vous permettra d'économiser des tonnes de code. –

Répondre

6

ParticipantTypeBudget est un membre de ProgramBudget. ParticipantTypeBudget hérite également de ProgramBudget, ce qui signifie qu'il obtient tous les membres non privés de ProgramBudget.

Voir le problème?

class Foo { 
    class Bar : Foo { 

    } 
} 

//perfectly legal: 
Foo.Bar.Bar.Bar.Bar.Bar = new Foo.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar(); 

Pour se débarrasser de cette récursivité, déplacer ParticipantTypeBudget, etc sur ProgramBudget.

EDIT: Vous avez également posé des questions sur les propriétés automatiques. Ce sont des propriétés qui n'ont pas de champs explicites explicites. J'utilise deux modèles:

Pour une propriété en lecture/écriture, vous faites ceci:

public int MyProperty { 
    get; 
    set; 
} 

Notez que les deux et ECRIRE ne doit pas avoir un corps.

Si vous avez besoin d'une propriété en lecture seule, à savoir celui qui ne peut être réglé par l'objet lui-même, faire l'élément d'ensemble protégé:

public int MyProperty { 
    get; 
    protected set; 
} 
+0

J'ai ajouté des exemples d'auto-propriétés pour vous. –

+0

C'est tout ce qu'il ya de propriétés auto? c'est assez facile – mattgcon

+0

Yup. Agréable et facile. Rappelez-vous juste: si vous ajoutez un corps à obtenir ou à définir, vous devez également implémenter l'autre. –

2

Depuis ParticipantTypeBudget est une sous-classe de ProgramBudget, il hérite des membres de l » ensemble ProgramBudget, y compris toutes les classes imbriquées - donc, elle-même, y compris. La vraie question est, cependant: pourquoi voulez-vous exactement que tous soient des classes imbriquées? Quel avantage cela vous apporte-t-il?

+0

Je soupçonne que l'OP n'a pas écrit lui-même toutes ces classes imbriquées –

+0

Fyodor, mon intention était d'avoir tout contenu dans l'objet ProgramBudget. Je voulais que tout soit accessible depuis l'objet ProgramBudget dans le formulaire. Est-ce codage même possible ou correct? – mattgcon

+0

Oui, je comprends que vous vouliez qu'ils soient tous dans ProgramBudger. Mais la question était: quel bénéfice espérez-vous tirer d'un tel arrangement? –

0

Vos types dérivés sont des enfants de leur type de base créant ainsi une relation parent-enfant infiniment récursive. Déplacez les classes enfant dérivées dans leur propre classe indépendante afin d'éliminer l'imbrication infinie.

0

Je présente mes excuses à tous pour perdre votre temps tout le monde. J'ai été malade et je ne pensais pas clairement quand j'ai créé cette classe. Je comprends complètement la chose récurrente maintenant et j'aurais dû créer des classes personnalisées pour chacune des sous-classes en dehors de la classe ProgramBudget et créer une propriété dans le ProgramBudget pour chacune des sous-classes. Je vais regarder les propriétés automobiles et utiliser ce concept aussi bien.

Questions connexes