protected virtual void CreateControlHierarchy(bool useDataSource)
{
var count = -1;
IEnumerable dataSource = null;
var itemsArray = new List<AccordionPane>();
if(!useDataSource) {
var viewCount = ViewState[ItemCountViewStateKey];
// ViewState must have a non-null value for ItemCount because we check for
// this in CreateChildControls
if(viewCount != null) {
count = (int)viewCount;
if(count != -1) {
var dummyList = new List<object>(count);
for(var i = 0; i < count; i++)
dummyList.Add(null);
dataSource = dummyList;
itemsArray.Capacity = count;
}
}
} else {
dataSource = GetData();
count = 0;
var collection = dataSource as ICollection;
if(collection != null)
itemsArray.Capacity = collection.Count;
}
if(dataSource != null) {
var index = 0;
foreach(var dataItem in dataSource) {
var ap = new AccordionPane();
ap.ID = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}_Pane_{1}", ID, index.ToString(CultureInfo.InvariantCulture));
Controls.Add(ap);
CreateItem(dataItem, index, AccordionItemType.Header, ap.HeaderContainer, HeaderTemplate, useDataSource);
CreateItem(dataItem, index, AccordionItemType.Content, ap.ContentContainer, ContentTemplate, useDataSource);
itemsArray.Add(ap);
count++;
index++;
}
}
// If we're binding, save the number of items contained in the repeater for use in round-trips
if(useDataSource)
ViewState[ItemCountViewStateKey] = ((dataSource != null) ? count : -1);
}