3

I created a customer configuration class Reports. I then created another class called "ReportsCollection". When I try and do the "ConfigurationManager.GetSection()", it doesn't populate my collection variable. Can anyone see any mistakes in my code?

Here is the collection class:

public class ReportsCollection : ConfigurationElementCollection
{
    public ReportsCollection()
    {
    }

    protected override ConfigurationElement CreateNewElement()
    {
        throw new NotImplementedException();
    }

    protected override ConfigurationElement CreateNewElement(string elementName)
    {
        return base.CreateNewElement(elementName);
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        throw new NotImplementedException();
    }

    public Report this[int index]
    {
        get { return (Report)BaseGet(index); }
    }
}

Here is the reports class:

public class Report : ConfigurationSection
{
    [ConfigurationProperty("reportName", IsRequired = true)]
    public string ReportName
    {
        get { return (string)this["reportName"]; }
        //set { this["reportName"] = value; }
    }

    [ConfigurationProperty("storedProcedures", IsRequired = true)]
    public StoredProceduresCollection StoredProcedures
    {
        get { return (StoredProceduresCollection)this["storedProcedures"]; }
    }

    [ConfigurationProperty("parameters", IsRequired = false)]
    public ParametersCollection Parameters
    {
        get { return (ParametersCollection)this["parameters"]; }
    }

    [ConfigurationProperty("saveLocation", IsRequired = true)]
    public string SaveLocation
    {
        get { return (string)this["saveLocation"]; }
    }

    [ConfigurationProperty("recipients", IsRequired = true)]
    public RecipientsCollection Recipients
    {
        get { return (RecipientsCollection)this["recipients"]; }
    }
}

public class StoredProcedure : ConfigurationElement
{
    [ConfigurationProperty("storedProcedureName", IsRequired = true)]
    public string StoredProcedureName
    {
        get { return (string)this["storedProcedureName"]; }
    }
}

public class StoredProceduresCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        throw new NotImplementedException();
    }

    protected override ConfigurationElement CreateNewElement(string elementName)
    {
        return base.CreateNewElement(elementName);
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        throw new NotImplementedException();
    }

    public StoredProcedure this[int index]
    {
        get { return (StoredProcedure)base.BaseGet(index); }
    }
}
}

And here is the very straight-forward code to create the variable:

ReportsCollection reportsCollection = (ReportsCollection) System.Configuration.ConfigurationManager.GetSection("ReportGroup");

EDIT Added App.Config

<configSections>
<sectionGroup name="ReportGroup">
  <section name="Reports" type="ReportsGenerator.ReportsCollection"/>
</sectionGroup>
</configSections>
<ReportGroup>
<Reports name="DailyIssues" SaveLocation="">
  <StoredProcedures>
    <add StoredProcedureName="RPTDailyIssues" />
    <add StoredProcedureName="RPTNoIssues" />
  </StoredProcedures>
  <Parameters>
    <add ParameterName="@FromDate" />
    <add ParameterName="@ThruDate" />
  </Parameters>
  <Recipients>
    <add RecipientName="[email protected]"
  </Recipients>
</Reports>
</ReportGroup>

2 Answers 2

4

You should check out Jon Rista's three-part series on .NET 2.0 configuration up on CodeProject.

Highly recommended, well written and extremely helpful!

Also, there's a Configuration Section Designer add-in for Visual Studio which is extremely helpful for creating custom configuration sections - it features a visual designer that creates all the necessary XSD and classes in the background.

Marc

Sign up to request clarification or add additional context in comments.

2 Comments

+1 - valuable resource. examples could be a bit more focused but will get you anywhere you need to go.
+1 as well, although you have to download and compile the source for VS2010.
0

I didn't write configuration sections for awhile, but out of the top of my head your CreateNewElement() methods throw exceptions.. Make them at least return dummy entries, maybe that's the reason.. )

Also, show the reportsCollection element in your web.config.. is it registered correctly?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.