пятница, января 23, 2009

Динамическое создание вкладок для ajax tab container

Динамическое создание вкладок для ajax tab container;
Ситуация была следующая - в разметке был размещен контейнер, для которого создавал вкладки динамически...
разметка:

<ajaxtoolkit:tabcontainer id="tabContainerCompanyProfile" runat="server" enableviewstate="true" width="100%">
</ajaxtoolkit:tabcontainer>


до постбека все происходило нормально, при переходе на другую страницу или при постбеке получал сообщение:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.

ну и stack trace до вызова set_ActiveTabIndex;

лечится только динамическим созданием самого tab container как показано ниже:
помещаем в place holder и затем уже добавляем вкладки...


разметка:


<table>
<tr>
<td>
<asp:PlaceHolder ID="phTabContainer" runat="server" EnableViewState="true">
</asp:PlaceHolder>
</td>
</tr>
...........................


фрагмент кода:


var availableTabs = (from pd in this.ProfileDescriptors
where pd.CompanyTypes.Contains(this.CompanyType) &&
(pd.EditMode == EditMode.All || pd.EditMode == this.ProfileMode)
select pd).ToList();


if (availableTabs != null &&
availableTabs.Count > 0)
{

AjaxControlToolkit.TabContainer tabContainer = new AjaxControlToolkit.TabContainer();
tabContainer.Width = Unit.Parse("100%");
tabContainer.Enabled = true;
tabContainer.Visible = true;

phTabContainer.Controls.Add(tabContainer);

foreach (ProfileDescriptor profileDescriptor in availableTabs)
{
foreach (TabDescriptor tabDescriptor in profileDescriptor.TabDescriptors)
{
CompanyProfileTabs.CompanyPropertiesTabBase propertiesEditor = (CompanyProfileTabs.CompanyPropertiesTabBase)this.LoadControl(tabDescriptor.TabControlURL);
if (propertiesEditor != null)
{
AjaxControlToolkit.TabPanel tab = new AjaxControlToolkit.TabPanel();
tab.Visible = true;
tab.Width = Unit.Percentage(100);
tab.Enabled = true;
tab.HeaderText = tabDescriptor.HeaderCaption;

propertiesEditor.Visible = true;
tab.Controls.Add(propertiesEditor);


tabContainer.Tabs.Add(tab);

this.Tabs.Add(propertiesEditor);
}
}

}

if (this.Tabs.Count > 0)
{
tabContainer.ActiveTabIndex = 0;
}
}

Комментариев нет: