
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;

}