5,663,486 members and growing! (18,790 online)
Email Password   helpLost your password?
Web Development » ASP.NET » General     Intermediate

ASP.NET controls to display enum values

By Howard Richards

RadioButtonList and ListBox subclasses that display Enum values automatically
VB 8.0, VB 9.0, VB, Windows, .NET, .NET 3.0, .NET 2.0, WebForms, ASP.NET, VS2005, Visual Studio, Dev

Posted: 30 Mar 2007
Updated: 9 Apr 2007
Views: 21,596
Bookmarked: 29 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
13 votes for this Article.
Popularity: 5.04 Rating: 4.52 out of 5
0 votes, 0.0%
1
1 vote, 7.7%
2
1 vote, 7.7%
3
1 vote, 7.7%
4
10 votes, 76.9%
5
Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article

Introduction

Enums are great. They define a set of permissible values and provide a way of type-checking parameters for functions and methods. The problem is that there is a bit of gap between Enums and user interfaces. So I created the RadioButtonEnum and ListBoxEnum controls allow you to bind a control to an Enum type automatically.

Background

I got fed up of building these UI components manually and realised I should not be copying values and text from the class to the UI, when the .NET framework can do this for me.

Using the code

How often do you see this in your code:

Public Enum Genders
  Male
  Female
End Enum

And the interface component thus:

<asp:RadioButtonList ID="RadioButtonList1" runat="server">
  <asp:ListItem Value="0" Text="Male" />
  <asp:ListItem Value="1" Text="Female" /> 
</asp:RadioButtonList>

Then the code changes, for example:

Public Enum Genders
  NotSpecified
  Male
  Female
End Enum

Now your interface control is mismatched and an existing value of 1 (female originally) now gets displayed as 'Male' and will throw an exception if you try to bind SelectedValue to a 2 (Female).

Approach

I realised that it should be fairly simple to subclass a RadioButtonList and tell it to fill itself from a given Enum type. It actually took a bit of learning and experimenting but it now works. In my example I've also done this for a ListBox control but it can be replicated for DropDownList and others quite easily. To help this re-use I have put all the code for obtaining the values from Enums inside the EnumHelper class which can be reused from your own controls.

First I created a subclass of the RadioButtonList

Public Class RadioButtonEnum
  Inherits RadioButtonList

Then I added EnumType property where you specify the typename of the enum. Although this worked fine for a global Enum such as System.DayOfWeek, it failed when I tried an embedded class, e.g. MyClass.MyEnum. A few tests and a search on GetType in MSDN revealed that Enums inside classes have to be delineated with '+' and not '.' so instead the EnumType should be specified as MyClass+MyEnum.

When adding an enum from a module (other than the current module) you also need to specify this. e.g. if MyClass is in TestCode.DLL which has a base Namespace of XXX then the enum type should read: "XXX.MyClass+MyEnum,TestCode" - see http://msdn2.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx for more information.

Naming Issues

Although getting the values and names for an enum type are fairly simple, the naming restrictions of enum values in code are quite tight - alphanumeric and underscores are the only permitted characters. Although an Enum value of SendToCustomer is fine in code, it's not really good practice to use this value in the user interface.

To address this I added a FixNames property which can be set to true to adjust enum values with underscores or CamelCase to more readable ones. Thus SendToCustomer becomes Send To Customer in the control.

And yet there might be situations where we want other characters, e.g. Urgent! - or extended character sets. I therefore added the capability to look for a Description attribute (System.ComponentModel.DescriptionAttribute).

The actual Enum value items are accessible as Fields of the Enum type, so the function GetEnumNames() checks to see if any value has a Description attribute and uses that value if present. e.g.

Public Enum BookRatingWithDescription
  <Description("A <b>great</b> book!")> GreatBook
  <Description("Enjoyable read")> Enjoyable
  <Description("Not bad - ok")> OK
  Poor
  <Description("Where's the shredder?")> Terrible
End Enum

HTML Trick

A useful trick is that the text of Description attribute can contain HTML tags (this works with a RadioButtonEnum but not a ListBoxEnum) as shown in the first enum value above.

I also use XML a lot, so I added the ability to use XmlEnumAttribute values if these are present, and the UseXmlNames property is set to True.

Example

To test this I've included a web site that demonstrates the various functions. Here is the web page in design mode:

Design Mode

When the page is displayed the controls are filled automatically - hurray!

Browser Screenshot

In the Enum with descriptions the first item uses the HTML tags in the description. The last two examples show the same Enum - in the first instance with FixNames=False, and in the second FixNames=True.

Conclusion

Well thats it - no more copying the enum values into your controls. Hope you find it useful.

History

Version 1.0: RadioButtonEnum and ListBoxEnum. Although written in VS2005 it should be possible to modify this code to work on .NET 1.x by changing the references to generic collections to supported types in 1.x.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Howard Richards



Occupation: Architect
Location: United Kingdom United Kingdom

Other popular ASP.NET articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 10 of 10 (Total in Forum: 10) (Refresh)FirstPrevNext
GeneralHow to access the selected value from code behind?membersp04110:59 30 Jul '07  
AnswerRe: How to access the selected value from code behind?memberHoward Richards5:32 31 Jul '07  
GeneralRe: How to access the selected value from code behind?membersp0416:19 31 Jul '07  
Generalbetter approachmembermaxtoroq20:38 21 Apr '07  
GeneralRe: better approachmemberHoward Richards23:36 21 Apr '07  
GeneralRe: better approachmemberHoward Richards0:24 22 Apr '07  
GeneralRe: better approachmembermaxtoroq11:15 22 Apr '07  
GeneralIt looks fine !!!memberNuno M. F. Gomes1:20 3 Apr '07  
GeneralRe: It looks fine !!!memberHoward Richards4:24 4 Apr '07  
AnswerRe: It looks fine !!!memberNuno M. F. Gomes5:30 4 Apr '07  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 9 Apr 2007
Editor:
Copyright 2007 by Howard Richards
Everything else Copyright © CodeProject, 1999-2008
Web13 | Advertise on the Code Project