Chris O’Brien is right: SPDataSource is quite handy. However, its documentation leaves something to be desired. In particular, there aren’t any examples (that I can find) of how to use the Webs and ListOfLists SPDataSourceModes. It turns out that the result sets map to a subset of properties (both internal and public) of SPWeb and SPList, respectively—but prepended with “__sp”. An easy way to see all available fields is to bind the data source to an asp:GridView with auto-generated columns:
<WSS:SPDataSource runat="server" ID="dsWebs" DataSourceMode="Webs" />
<asp:GridView runat="server" ID="grdWebs" DataSourceID="dsWebs" AutoGenerateColumns="True">
<RowStyle VerticalAlign="Top" />
</asp:GridView>
<WSS:SPDataSource runat="server" ID="dsLists" DataSourceMode="ListOfLists" />
<asp:GridView runat="server" ID="grdLists" DataSourceID="dsLists" AutoGenerateColumns="True">
<RowStyle VerticalAlign="Top" />
</asp:GridView>
For easy reference, I’ve put together a complete list of fields here:
SPDataSource Fields for Webs & ListsOfLists
Note that SharePoint Designer’s live preview of the grid shows extra columns (for Webs: __spAlerts, __spAllProperties, __spAllUsers, etc) that aren’t included in the rendering outside of Designer.
SPDataSourceMode.Webs Example
A list of fields is all well and good, but what can we do with it? Suppose we want an easy way to access our favorite settings pages for our subwebs. A contrived example, perhaps, but it will serve its purpose. We start with our data source:
<WSS:SPDataSource runat="server" ID="dsWebs" DataSourceMode="Webs" IncludeHidden="true"/>
Next, we’ll define a MenuTemplate of the site settings shortcuts we want available. %URL% is a token we’ll define in our SPMenuField.
<WSS:MenuTemplate runat="server" ID="WebMenu" CompactMode="true">
<WSS:MenuItemTemplate runat="server" Text="Create"
ClientOnClickNavigateUrl="%URL%/_layouts/create.aspx" />
<WSS:MenuItemTemplate runat="server" Text="Site Settings"
ClientOnClickNavigateUrl="%URL%/_layouts/settings.aspx" />
<WSS:MenuSeparatorTemplate runat="server" />
<WSS:MenuItemTemplate runat="server" Text="People and groups"
ClientOnClickNavigateUrl="%URL%/_layouts/people.aspx" />
<WSS:MenuItemTemplate runat="server" Text="Advanced permissions"
ClientOnClickNavigateUrl="%URL%/_layouts/user.aspx" />
<WSS:MenuSeparatorTemplate runat="server" />
<WSS:MenuItemTemplate runat="server" Text="Site libraries and lists"
ClientOnClickNavigateUrl="%URL%/_layouts/mcontent.aspx" />
<WSS:MenuItemTemplate runat="server" Text="Sites and workspaces"
ClientOnClickNavigateUrl="%URL%/_layouts/mngsubwebs.aspx" />
<WSS:MenuItemTemplate runat="server" Text="Site features"
ClientOnClickNavigateUrl="%URL%/_layouts/ManageFeatures.aspx" />
<WSS:MenuItemTemplate runat="server" Text="Delete this site"
ClientOnClickNavigateUrl="%URL%/_layouts/deleteweb.aspx" />
</WSS:MenuTemplate>
And finally, a simple SPGridView with a link and menu for our site, with an extra column just for good measure:
<WSS:SPGridView runat="server" ID="spGrdWebs"
DataSourceID="dsWebs" AutoGenerateColumns="false">
<Columns>
<WSS:SPMenuField HeaderText="Site Title"
NavigateUrlFields="__spDefaultUrl"
NavigateUrlFormat="{0}"
MenuTemplateId="WebMenu"
TokenNameAndValueFields="URL=__spUrl,ID=__spID"
TextFields="__spTitle" />
<WSS:SPBoundField HeaderText="Site Created"
DataField="__spCreated" />
</Columns>
</WSS:SPGridView>
And our final result will look something like this:

So we’ve seen how to use SPDataSource in Webs mode, plus we have a code-free example of the often-overlooked SPMenuField. For what else could the Webs and ListOfLists modes be used?

