protected override void afterPopulateProps()
        {
            // CertDef Specs do not have levels...?
            //// CIS-52299: "Limits" are required if certdef's level's labuseonly is false, hidden otherwise
            //CswNbtObjClassCertDefSpec CertDefSpecNode = _CswNbtResources.Nodes[CertDefSpec.RelatedNodeId];
            //if( null != CertDefSpecNode )
            //{
            //    CswNbtObjClassLevel LevelNode = _CswNbtResources.Nodes[CertDefSpec.Level.RelatedNodeId];
            //    if( null != LevelNode )
            //    {
            //        if( LevelNode.LabUseOnly.Checked == CswEnumTristate.True )
            //        {
            //            Limits.TemporarilyRequired = true;
            //        }
            //        else
            //        {
            //            Limits.setHidden( true, true );
            //        }
            //    }
            //}

            CswNbtObjClassMethodCharacteristic MethodCharNode = _CswNbtResources.Nodes[MethodCharacteristic.RelatedNodeId];

            if (null != MethodCharNode)
            {
                // CIS-52299: "Pass Options" list options come from Method Characteristic's "Result Options" Memo property
                PassOptions.InitOptions = delegate
                {
                    Dictionary <string, string> ret  = new Dictionary <string, string>();
                    CswDelimitedString          opts = new CswDelimitedString('\n');
                    opts.FromString(MethodCharNode.ResultOptions.Text.Replace(',', '\n'), true, true);
                    foreach (string opt in opts)
                    {
                        ret.Add(opt, opt);
                    }
                    return(ret);
                };

                // CIS-52299: Round limits to precision defined on method characteristic
                Limits.Precision = CswConvert.ToInt32(MethodCharNode.Precision.Value);
            }
            base.afterPopulateProps();
        } // afterPopulateProps()
        /// <summary>
        /// for each method condition and method characteristic attached to this
        /// certDef, this method created a corresponding certDef condition
        /// and certDef characteristic. 
        /// </summary>
        private void _createCertDefSpecsAndCharacteristics()
        {
            
            CswNbtMetaDataObjectClass MethodOC = _CswNbtResources.MetaData.getObjectClass( CswEnumNbtObjectClass.MethodClass );
            CswNbtMetaDataObjectClass MethodConditionOC = _CswNbtResources.MetaData.getObjectClass( CswEnumNbtObjectClass.MethodConditionClass );
            CswNbtMetaDataObjectClass MethodCharacteristicOC = _CswNbtResources.MetaData.getObjectClass( CswEnumNbtObjectClass.MethodCharacteristicClass);
            CswNbtMetaDataObjectClass CertDefConditionOC = _CswNbtResources.MetaData.getObjectClass( CswEnumNbtObjectClass.CertDefConditionClass );
            CswNbtMetaDataObjectClass CertDefCharacteristicOC = _CswNbtResources.MetaData.getObjectClass( CswEnumNbtObjectClass.CertDefCharacteristicLimitClass);

            CswNbtMetaDataNodeType CertDefConditionDefaultNT = CertDefConditionOC.FirstNodeType;
            CswNbtMetaDataNodeType CertDefCharacteristicDefaultNT = CertDefCharacteristicOC.FirstNodeType;

            CswNbtMetaDataObjectClassProp MethodConditionMethodOCP = _CswNbtResources.MetaData.getObjectClassProp(MethodConditionOC.ObjectClassId, 
                                                                                                                  CswNbtObjClassMethodCondition.PropertyName.Method);
            CswNbtMetaDataObjectClassProp MethodCharacteristicMethodOCP = _CswNbtResources.MetaData.getObjectClassProp(MethodCharacteristicOC.ObjectClassId, 
                                                                                                                  CswNbtObjClassMethodCharacteristic.PropertyName.Method);

            //create a view of all methodcondition and methodcharacteristics
            //attached to this method
            CswNbtView MethodConditionAndCharacteristicsView = new CswNbtView( _CswNbtResources );
            MethodConditionAndCharacteristicsView.ViewName = "View of all method characteristics and method conditions attached to a method";

            CswNbtViewRelationship MethodAsRootRelationship = MethodConditionAndCharacteristicsView.AddViewRelationship( MethodOC, false );
            MethodAsRootRelationship.NodeIdsToFilterIn.Add( Method.RelatedNodeId );

            MethodConditionAndCharacteristicsView.AddViewRelationship( MethodAsRootRelationship,
                                                                       CswEnumNbtViewPropOwnerType.Second,
                                                                       MethodConditionMethodOCP,
                                                                       false );
            MethodConditionAndCharacteristicsView.AddViewRelationship( MethodAsRootRelationship,
                                                                       CswEnumNbtViewPropOwnerType.Second,
                                                                       MethodCharacteristicMethodOCP,
                                                                       false );

            ICswNbtTree MethodConditionAndCharacteristicsTree = _CswNbtResources.Trees.getTreeFromView( MethodConditionAndCharacteristicsView, false, true, true, true );
            if( MethodConditionAndCharacteristicsTree.getChildNodeCount() > 0 )
            {
                MethodConditionAndCharacteristicsTree.goToNthChild( 0 );

                for( int i = 0; i < MethodConditionAndCharacteristicsTree.getChildNodeCount(); i++ )
                {
                    MethodConditionAndCharacteristicsTree.goToNthChild( i );
                    CswNbtNode thisNode = MethodConditionAndCharacteristicsTree.getNodeForCurrentPosition();

                    CswEnumNbtObjectClass thisNodeOC = thisNode.getObjectClass().ObjectClass;

                    if( thisNodeOC == CswEnumNbtObjectClass.MethodConditionClass)
                    {
                        if( CertDefConditionDefaultNT != null )
                        {
                        CswNbtObjClassMethodCondition thisMethodCondition = thisNode;
                        CswNbtObjClassCertDefCondition correspondingCertDefCondition = _CswNbtResources.Nodes.makeNodeFromNodeTypeId( CertDefConditionDefaultNT.NodeTypeId );

                        correspondingCertDefCondition.MethodCondition.RelatedNodeId = thisMethodCondition.NodeId;
                        correspondingCertDefCondition.CertDefSpec.RelatedNodeId = this.NodeId;
                        
                        correspondingCertDefCondition.postChanges( false );

                           
                        }

                        else
                        {
                            throw new CswDniException(CswEnumErrorType.Error,
                                                      "A CertDef Condition corresponding to an existing Method Condition could not be created because there is no CertDef Condition NodeType",
                                                      "CertDef Condition NodeType not found, so CertDef Condition cannot be created");
                        }
                    }

                    else if( thisNodeOC == CswEnumNbtObjectClass.MethodCharacteristicClass)
                    {
                        if( CertDefConditionDefaultNT != null )
                        {
                        CswNbtObjClassMethodCharacteristic thisMethodCharacteristic = thisNode;
                        CswNbtObjClassCertDefCharacteristicLimit correspondingCertDefCharacteristic = _CswNbtResources.Nodes.makeNodeFromNodeTypeId( CertDefCharacteristicDefaultNT.NodeTypeId );

                        correspondingCertDefCharacteristic.MethodCharacteristic.RelatedNodeId = thisMethodCharacteristic.NodeId;
                        correspondingCertDefCharacteristic.CertDefSpec.RelatedNodeId = this.NodeId;

                        correspondingCertDefCharacteristic.postChanges( false );

                        }
                        else 
                        {
                            throw new CswDniException(CswEnumErrorType.Error,
                                                      "A CertDef Characteristic Limit corresponding to an existing Method Characteristic Limit could not be created because there is no CertDef Characteristic Limit NodeType",
                                                      "CertDef Characteristic Limit NodeType not found, so CertDef Characteristic Limit cannot be created");
                        }
                    }

                    MethodConditionAndCharacteristicsTree.goToParentNode();

                }
            }
           
        }
        /// <summary>
        /// Create an ObjClass instance for given ObjectClass and Node
        /// </summary>
        public static CswNbtObjClass makeObjClass(CswNbtResources CswNbtResources, CswNbtMetaDataObjectClass ObjectClass, CswNbtNode Node = null)
        {
            CswNbtObjClass ReturnVal = null;

            switch (ObjectClass.ObjectClass)
            {
            case CswEnumNbtObjectClass.BalanceClass:
                ReturnVal = new CswNbtObjClassBalance(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.BalanceConfigurationClass:
                ReturnVal = new CswNbtObjClassBalanceConfiguration(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.BatchOpClass:
                ReturnVal = new CswNbtObjClassBatchOp(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.BiologicalClass:
                ReturnVal = new CswNbtObjClassBiological(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CertDefCharacteristicLimitClass:
                ReturnVal = new CswNbtObjClassCertDefCharacteristicLimit(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CertDefSpecClass:
                ReturnVal = new CswNbtObjClassCertDefSpec(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CertificateDefinitionClass:
                ReturnVal = new CswNbtObjClassCertificateDefinition(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CertDefConditionClass:
                ReturnVal = new CswNbtObjClassCertDefCondition(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CertDefSpecLevelClass:
                ReturnVal = new CswNbtObjClassCertDefSpecLevel(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CofADocumentClass:
                ReturnVal = new CswNbtObjClassCofADocument(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CofAMethodClass:
                ReturnVal = new CswNbtObjClassCofAMethod(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CofAMethodTemplateClass:
                ReturnVal = new CswNbtObjClassCofAMethodTemplate(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ContainerClass:
                ReturnVal = new CswNbtObjClassContainer(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ContainerDispenseTransactionClass:
                ReturnVal = new CswNbtObjClassContainerDispenseTransaction(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ContainerGroupClass:
                ReturnVal = new CswNbtObjClassContainerGroup(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ContainerLocationClass:
                ReturnVal = new CswNbtObjClassContainerLocation(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ControlZoneClass:
                ReturnVal = new CswNbtObjClassControlZone(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.CustomerClass:
                ReturnVal = new CswNbtObjClassCustomer(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DepartmentClass:
                ReturnVal = new CswNbtObjClassDepartment(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DesignNodeTypeClass:
                ReturnVal = new CswNbtObjClassDesignNodeType(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DesignNodeTypePropClass:
                ReturnVal = new CswNbtObjClassDesignNodeTypeProp(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DesignNodeTypeTabClass:
                ReturnVal = new CswNbtObjClassDesignNodeTypeTab(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DesignSequenceClass:
                ReturnVal = new CswNbtObjClassDesignSequence(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DocumentClass:
                ReturnVal = new CswNbtObjClassDocument(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.DSDPhraseClass:
                ReturnVal = new CswNbtObjClassDSDPhrase(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.EnterprisePartClass:
                ReturnVal = new CswNbtObjClassEnterprisePart(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.EquipmentAssemblyClass:
                ReturnVal = new CswNbtObjClassEquipmentAssembly(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.EquipmentClass:
                ReturnVal = new CswNbtObjClassEquipment(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.EquipmentTypeClass:
                ReturnVal = new CswNbtObjClassEquipmentType(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.FeedbackClass:
                ReturnVal = new CswNbtObjClassFeedback(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.FireClassExemptAmountClass:
                ReturnVal = new CswNbtObjClassFireClassExemptAmount(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.FireClassExemptAmountSetClass:
                ReturnVal = new CswNbtObjClassFireClassExemptAmountSet(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GenericClass:
                ReturnVal = new CswNbtObjClassGeneric(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GHSClass:
                ReturnVal = new CswNbtObjClassGHS(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GHSClassificationClass:
                ReturnVal = new CswNbtObjClassGHSClassification(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GHSPhraseClass:
                ReturnVal = new CswNbtObjClassGHSPhrase(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GHSSignalWordClass:
                ReturnVal = new CswNbtObjClassGHSSignalWord(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InspectionDesignClass:
                ReturnVal = new CswNbtObjClassInspectionDesign(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InspectionRouteClass:
                ReturnVal = new CswNbtObjClassInspectionRoute(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InspectionTargetClass:
                ReturnVal = new CswNbtObjClassInspectionTarget(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InspectionTargetGroupClass:
                ReturnVal = new CswNbtObjClassInspectionTargetGroup(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InventoryGroupClass:
                ReturnVal = new CswNbtObjClassInventoryGroup(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InventoryGroupPermissionClass:
                ReturnVal = new CswNbtObjClassInventoryGroupPermission(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.InventoryLevelClass:
                ReturnVal = new CswNbtObjClassInventoryLevel(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.JurisdictionClass:
                ReturnVal = new CswNbtObjClassJurisdiction(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.Level:
                ReturnVal = new CswNbtObjClassLevel(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.LocationClass:
                ReturnVal = new CswNbtObjClassLocation(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.LQNoClass:
                ReturnVal = new CswNbtObjClassLQNo(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ManufacturerClass:
                ReturnVal = new CswNbtObjClassManufacturer(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ManufacturerEquivalentPartClass:
                ReturnVal = new CswNbtObjClassManufacturerEquivalentPart(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ChemicalClass:
                ReturnVal = new CswNbtObjClassChemical(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MaterialComponentClass:
                ReturnVal = new CswNbtObjClassMaterialComponent(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MaterialSynonymClass:
                ReturnVal = new CswNbtObjClassMaterialSynonym(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MailReportClass:
                ReturnVal = new CswNbtObjClassMailReport(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MailReportGroupClass:
                ReturnVal = new CswNbtObjClassMailReportGroup(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MailReportGroupPermissionClass:
                ReturnVal = new CswNbtObjClassMailReportGroupPermission(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MethodClass:
                ReturnVal = new CswNbtObjClassMethod(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MethodCharacteristicClass:
                ReturnVal = new CswNbtObjClassMethodCharacteristic(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.MethodConditionClass:
                ReturnVal = new CswNbtObjClassMethodCondition(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.NonChemicalClass:
                ReturnVal = new CswNbtObjClassNonChemical(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.PrinterClass:
                ReturnVal = new CswNbtObjClassPrinter(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.PrintJobClass:
                ReturnVal = new CswNbtObjClassPrintJob(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.PrintLabelClass:
                ReturnVal = new CswNbtObjClassPrintLabel(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ProblemClass:
                ReturnVal = new CswNbtObjClassProblem(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ReceiptLotClass:
                ReturnVal = new CswNbtObjClassReceiptLot(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RegulatoryListClass:
                ReturnVal = new CswNbtObjClassRegulatoryList(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RegulatoryListCasNoClass:
                ReturnVal = new CswNbtObjClassRegulatoryListCasNo(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RegulatoryListMemberClass:
                ReturnVal = new CswNbtObjClassRegulatoryListMember(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RegulatoryListListCodeClass:
                ReturnVal = new CswNbtObjClassRegulatoryListListCode(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ReportClass:
                ReturnVal = new CswNbtObjClassReport(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ReportGroupClass:
                ReturnVal = new CswNbtObjClassReportGroup(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.ReportGroupPermissionClass:
                ReturnVal = new CswNbtObjClassReportGroupPermission(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RequestClass:
                ReturnVal = new CswNbtObjClassRequest(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RequestItemClass:
                ReturnVal = new CswNbtObjClassRequestItem(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.RoleClass:
                ReturnVal = new CswNbtObjClassRole(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.SDSDocumentClass:
                ReturnVal = new CswNbtObjClassSDSDocument(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.TestingLabClass:
                ReturnVal = new CswNbtObjClassTestingLab(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.GeneratorClass:
                ReturnVal = new CswNbtObjClassGenerator(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.SizeClass:
                ReturnVal = new CswNbtObjClassSize(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.TaskClass:
                ReturnVal = new CswNbtObjClassTask(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.TestingLabUserAssignmentClass:
                ReturnVal = new CswNbtObjClassTestingLabUserAssignment(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.TestingLabMethodAssignmentClass:
                ReturnVal = new CswNbtObjClassTestingLabMethodAssignment(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.UnitOfMeasureClass:
                ReturnVal = new CswNbtObjClassUnitOfMeasure(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.UserClass:
                ReturnVal = new CswNbtObjClassUser(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.VendorClass:
                ReturnVal = new CswNbtObjClassVendor(CswNbtResources, Node);
                break;

            case CswEnumNbtObjectClass.WorkUnitClass:
                ReturnVal = new CswNbtObjClassWorkUnit(CswNbtResources, Node);
                break;

            default:
                //ReturnVal = new CswNbtObjClassDefault( CswNbtResources, _CswNbtNode );
                throw (new CswDniException("There is no NbtObjClass derivative for object class " + ObjectClass.ObjectClass.ToString()));
            }//switch


            return(ReturnVal);
        } //makeObjClass()