C# 将一个值表单列表移动到另一个值表单列表,从列表中删除下一个值

C# 将一个值表单列表移动到另一个值表单列表,从列表中删除下一个值,c#,winforms,bindingsource,C#,Winforms,Bindingsource,我有两个列表框,当我将值交换到另一个列表框时,它总是从列表中删除下一个值,当我尝试从列表中交换最后一个值时,它从列表中获取最前面的一个值。我试图找出问题,但没有得到任何结果。下面是代码部分以供审查 private void MoveListBoxItems(ListBox lstEmployeelist, ListBox lstSelectedEmployees) { ListBox.SelectedObjectCollection sourceItems = lstEmployeeli

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

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;
    }
}
private void MoveListBoxItems(ListBox lstEmployeelist,ListBox lsselectedemployees)
{
ListBox.SelectedObjectCollection sourceItems=lstEmployeelist.SelectedItems;
List newsource=this.masterBindingSource.DataSource作为列表;
列表_selectedSource=this.masterSellectedBindingSource.DataSource作为列表;
尝试
{
如果(lstEmployeelist.Items.Count>0)
{
对于(int i=0;i 0)
this.masterBindingSource.RemoveCurrent();
this.masterSellectedBindingSource.EndEdit();
lstSelectedEmployees.DataSource=masterSellectedBindingSource;
lstSelectedEmployees.DisplayMember=“FirstName”;
lsselectedemployees.ValueMember=“Empno”;
}
}
捕获(例外情况除外)
{
掷骰子;
}
}

我认为问题在于您迭代sourceItems的方式

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

因此,第2项成为新的第1项,第3项成为第2项,等等

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


如果要移动所有项目而不是仅选择项目,则不应使用for循环,而是使用while,如下所示:

while (sourceItems.Count > 0)
{
    // code here
}

当用户从列表中选择多个项目时会发生什么?@a-goutam我不太明白你的意思?如果您正在处理列表中的选定项,那么您将遍历等效的SelectedItems集合,或者遍历每个项,检查它是否被选中并根据需要移动。你的代码并不能很好地演示你在做什么。我希望当用户从列表中选择一个值时,该值将从当前列表中删除,并且所选项目将在第二个列表中显示