bool IPostBackDataHandler.LoadPostData( string postDataKey, NameValueCollection postCollection)
{
// 处理被选中的value
string[] postedItems = postCollection.GetValues(postDataKey);
bool returnValue = false;
// 如果没有被选中的项
if (postedItems == null)
{
if ( this.SelectedIndex != -1)
{
returnValue = true;
}
// 处理客户端的变化去
goto HandleClientChanges;
}
// 如果SelectionMode是Single模式
if ( this.SelectionMode == ListSelectionMode.Single)
{
if (postedItems != null)
{
// 处理postedItems的第一项,其是被选中的
int index = this.FindByValueInternal(postedItems[0]);
if ( this.SelectedIndex != index)
{
// 发生变化了
this.SelectedIndex = index;
returnValue = true;
}
}
}
// 否则SelectionMode是Multiple模式
// 新的被选中的Length
int numberOfItemsSelected = postedItems.Length;
// 原来的被选中的索引集合
ArrayList oldSelectedItems = this.SelectedIndicesInternal;
// 新集合,Length为新的被选中的Length
ArrayList currentlySelectedItems = new ArrayList(numberOfItemsSelected);
// 把所有新的被选中的value塞进来
for ( int i = 0; i < numberOfItemsSelected; i++)
{
currentlySelectedItems.Add( this.FindByValueInternal(postedItems[i]));
}
// 原来被选中的Length
int numberOfSelectedItems = 0;
if (oldSelectedItems != null)
{
numberOfSelectedItems = oldSelectedItems.Count;
}
// 原来的和新的被选中的是否相同
if (numberOfItemsSelected == numberOfSelectedItems)
{
for ( int j = 0; j < numberOfItemsSelected; j++)
{
int oldSelect = Convert.ToInt32(currentlySelectedItems[j]);
int currentSelect = Convert.ToInt32(oldSelectedItems[j]);
if (oldSelect != currentSelect)
{
// 标记该项被选中
this.Items[j].Selected = true;
returnValue = true;
}
}
}
else
{
// 原来的和新的被选中的发生了变化(原来的和新的被选中的Length不同就肯定是发生变化了)
returnValue = true;
}
// 有变化,重新设置Selected(设为新的)
if (returnValue)
{
this.SelectInternal(currentlySelectedItems);
}
// 这部分处理客户端的变化(项的增减)
HandleClientChanges:
// 从项集合中删除项
// 处理客户端删除项操作
string itemsRemoved = postCollection[ this.HFItemsRemoved];
string[] itemsRemovedCol = itemsRemoved.Split(',');
if (itemsRemovedCol != null)
{
if ((itemsRemovedCol.Length > 0) && (itemsRemovedCol[0] != ""))
{
for ( int i = 0; i < itemsRemovedCol.Length; i++)
{
ListItem itemToRemove = this.Items.FindByValue(itemsRemovedCol[i]);
// 从集合中删除该项
Items.Remove(itemToRemove);
}
returnValue = true;
}
}
// 处理客户端增加项操作
string itemsAdded = postCollection[ this.HFItemsAdded];
string[] itemsCol = itemsAdded.Split(',');
if (itemsCol != null)
{
if ((itemsCol.Length > 0) && (itemsCol[0] != ""))
{
// counter 用于确定返回值是什么
int counter = -1;
for ( int i = 0; i < itemsCol.Length; i++)
{
string buf = itemsCol[i];
string[] itemsTokens = buf.Split('|');
// 通过value检查是否已集合中已有该value
ListItem it = this.Items.FindByValue(itemsTokens[1]);
if (it == null)
{
string text = itemsTokens[0];
string id = itemsTokens[1];
ListItem item = new ListItem(text, id);
Items.Add(item);
// 更新 counter
counter++;
}
}
returnValue = counter > -1 ? true : false;
}
}
return returnValue;
}