Ok. I managed to get around the collapsing problem by putting the id and runat=server in a div tag instead of a table tag.
<ItemTemplate>
<dnn:sectionhead id='dnnSection' runat="server"
CssClass="SubHead" IncludeRule="true" IsExpanded="false"
Section='section'
ResourceKey='<%# Eval("CategoryName") %>'
EnableViewState="true"
Text='<%# Eval("CategoryName") %>'
Visible="true" />
<div id="section" runat=server>
<table border="0" cellpadding="1" cellspacing="0" width="100%">
<tr>
<td>
<asp:Label ID="CategoryIdLabel" runat="server" Text='<%# Eval("CategoryId") %>' Visible="False"></asp:Label>
<asp:Label ID="CategoryDescLabel" runat="server" CssClass="normal" Text='<%# Eval("CategoryDesc") %>'></asp:Label>
</td>
</tr>
<tr>
<td valign="top">
<asp:GridView ....
</div>
<asp:FormView .....
The problem that still persists is the Text property of the section head not being set again on the select event of the gridview.
This is what I found when viewing the source:
Before:
<div>
<input type="image" name="dnnSection:imgIcon" id="dnnSection_imgIcon" tabindex="-1" title="Maximize" max_icon="/ErikDev/images/plus.gif" min_icon="/ErikDev/images/minus.gif" src="/ErikDev/images/plus.gif" alt="Maximize" border="0" onclick="if (__dnn_SectionMaxMin(this, 'dnn_ctr369_FRSAdmin_dlCategories__ctl0_section')) return false;" language="javascript" />
<span id="dnnSection_lblTitle" class="SubHead">Carpentry</span>
</div>
After:
<div>
<input type="image" name="dnnSection:imgIcon" id="dnnSection_imgIcon" tabindex="-1" title="Minimize" max_icon="/ErikDev/images/plus.gif" min_icon="/ErikDev/images/minus.gif" src="/ErikDev/images/minus.gif" alt="Minimize" border="0" onclick="if (__dnn_SectionMaxMin(this, 'dnn_ctr369_FRSAdmin_dlCategories__ctl0_section')) return false;" language="javascript" />
<span id="dnnSection_lblTitle" class="SubHead"></span>
</div>
So I assume that since I set the Text property to a bound value, that when the select event is called, it won't create a rebind of the data, thus no text.