Several times a week, if not daily, forum users describe a requirement that would normally be met via cascading drop-downs. For example, I have two drop-down controls:
- List of U.S. states
- List of U.S. cities.
As responsible UI providers, we want it to operate like this:
- Paul selects a U.S. state from the drop-down.
- This causes the cities drop-down to filter only those cities that belong to the selected state.
- Paul selects a city from this filtered list.
There is no out-of-the-box support for this feature. In fact, there is no OOB support for any kind of direct intra-form communication. This includes programmatically hiding/enabling/disabling fields in response to field changes elsewhere on the form.
The real objective of this article to to describe possible solutions and these are the options as I know them:
- Develop a custom column type. As a custom-column-developer, you have full control over the "world" of that custom column. You can implement a cascading drop-down that way.
- Consider using workflow. In some cases, you want to automatically assign a value to field based on another field’s value. In this case, you would normally try to use a calculated column, but some times, it just won’t get the job done. SharePoint Designer workflow is a relatively administer-friendly alternative to dropping down into code and visual studio. If you go this route, be aware of the issue addressed by this article (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
- Event handlers: Like workflow, this is an after-the-fact solution. Your event handler is a .NET assembly (C#, VB.NET) to which SharePoint passes control. The object you develop has access to the data of the list (and the whole object model) and can do any needed calculation.
- Use SharePoint Designer to create custom entry forms. I don’t have direct experience with this approach, but I hear they are doing good things with NewForm.aspx these days 🙂
- Roll your own ASP.NET data entry function (as a stand-alone web page or as a web part) and use that instead.
If anyone knows other and/or better options, please post a comment and I’ll update the body of this post.