1

我有两个列表框,当我将值交换到另一个列表框时,它总是从列表中删除下一个值,当我尝试从列表中交换最后一个值时,它会从列表中取顶部一个值。我试图找到问题,但我没有得到任何结果。以下是供审查的代码部分。

private void MoveListBoxItems(ListBox lstEmployeelist, ListBox lstSelectedEmployees)
{
    ListBox.SelectedObjectCollection sourceItems = lstEmployeelist.SelectedItems;
    List<Master> newsource = this.masterBindingSource.DataSource as List<Master>;
    List<Master> _selectedSource = this.masterSellectedBindingSource.DataSource as List<Master>;

    try
    {
        if (lstEmployeelist.Items.Count > 0)
        {
            for (int i = 0; i <= sourceItems.Count -1 ; i++)
            {
                Master item = sourceItems[i] as Master;
                this.masterSellectedBindingSource.AddNew();
                Master sitems = masterSellectedBindingSource.Current as Master;
                sitems.Empno = item.Empno;
                sitems.FirstName = item.FirstName;
                newsource.Remove((Master)item);
            }

            if (sourceItems.Count > 0)
                this.masterBindingSource.RemoveCurrent();

            this.masterSellectedBindingSource.EndEdit();
            lstSelectedEmployees.DataSource = masterSellectedBindingSource;
            lstSelectedEmployees.DisplayMember = "FirstName";
            lstSelectedEmployees.ValueMember = "Empno";
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
4

1 回答 1

-1

我相信问题在于您遍历 sourceItems 的方式。

因为您正在使用 for 循环执行此操作(可能是因为您无法使用 foreach 执行此操作,因为您无法修改集合),所以当您从集合中删除说项目 1 并将其添加到第二个列表时,项目 2 和所有项目上移后 1。

所以第 2 项成为新的第 1 项,第 3 项成为第 2 项,依此类推……

为了解决这个问题,当您决定移动一个项目时,您还需要将 i 减少 1 (i--;),以便当 for 循环再次循环并且 i 增加时,它会返回到相同的索引。


如果您要移动所有项目而不仅仅是选择项目,那么您不应该使用 for 循环,而是使用 while 像这样:

while (sourceItems.Count > 0)
{
    // code here
}
于 2013-05-31T11:17:22.043 回答