如何在达到条件后从列表框中删除对象
How to remove an object from a listbox after a condition is reached
我有一个通用的员工列表,我想在达到特定条件后将他们从列表框中删除。
目前我已经设法得到它的一种接近形式,但是如果列表框中有多个对象,它会在方法 运行 之后被复制。
- 每个员工都有一个
shifts left
变量,如果这种情况结束,他们将 运行 重新回到 free
列表中
private void btnCycle_Click(object sender, EventArgs e)
{
foreach (Employee emp in employees)
{
if (emp.Busy == true)
{
emp.ShiftsLeft--;
if (emp.ShiftsLeft == 0)
{
lstOccupied.Items.Clear();
emp.Busy = false;
DisplayData(employees);
}
}
}
}
private void DisplayData(List<Employee> employees)
{
foreach (Employee emp in employees)
{
if (emp.Busy == false)
lstFree.Items.Add(emp);
else if (emp.Busy == true)
lstOccupied.Items.Add(emp);
}
}
这是当前正在使用的对象
Employee e1 = new Employee(MemberJob.Employee, "Name", MemberSkills.CPlus, true,
"Do this Job", 5);
Employee e2 = new Employee(MemberJob.Employee, "Another name", MemberSkills.CSharp, true,
"Do another Job", 2);
结果
我提供的代码目前发生的情况是,在 Another name
完成轮班(2 个轮班)后,他们会 运行 返回 free
列表框,它们从 occupied
列表框中消失,这正是我想要的,然后在 Name
完成后,它们会放回 free
但 another name
显示两次。
可能的解决方案
我可以这样,如果这个名字在 free
上显示了不止一次,它就会被删除,只显示一次,但这很混乱,我可以想象如果一个员工的名字与另一个这会引起冲突。
完成第一个循环的逻辑工作,而不是在您仍在 运行 循环时尝试更新列表。清除两个列表后在循环 DisplayData 结束时。
private void btnCycle_Click(object sender, EventArgs e)
{
foreach (Employee emp in employees)
{
if (emp.Busy)
{
emp.ShiftsLeft--;
emp.Busy = emp.ShiftsLeft > 0;
// Do not try to update here
// finish the logic loop and...
}
}
}
// Clear the content of both lists
lstFree.Items.Clear();
lstOccupied.Items.Clear();
// Now rebuild both lists
DisplayData(employees);
如果您想删除员工列表上的双循环,您可以在开始第一个循环之前清除两个列表框,并在确定每个员工的忙碌状态后立即重新添加条目
private void btnCycle_Click(object sender, EventArgs e)
{
// Clear the content of both lists
lstFree.Items.Clear();
lstOccupied.Items.Clear();
foreach (Employee emp in employees)
{
if (emp.Busy)
{
emp.ShiftsLeft--;
if (emp.ShiftsLeft == 0)
{
lstFree.Items.Add(emp);
emp.Busy = false;
}
else
lstOccupied.Items.Add(emp);
}
}
}
当然,在此上下文中您不再调用 DisplayData。
我有一个通用的员工列表,我想在达到特定条件后将他们从列表框中删除。
目前我已经设法得到它的一种接近形式,但是如果列表框中有多个对象,它会在方法 运行 之后被复制。
- 每个员工都有一个
shifts left
变量,如果这种情况结束,他们将 运行 重新回到free
列表中
private void btnCycle_Click(object sender, EventArgs e)
{
foreach (Employee emp in employees)
{
if (emp.Busy == true)
{
emp.ShiftsLeft--;
if (emp.ShiftsLeft == 0)
{
lstOccupied.Items.Clear();
emp.Busy = false;
DisplayData(employees);
}
}
}
}
private void DisplayData(List<Employee> employees)
{
foreach (Employee emp in employees)
{
if (emp.Busy == false)
lstFree.Items.Add(emp);
else if (emp.Busy == true)
lstOccupied.Items.Add(emp);
}
}
这是当前正在使用的对象
Employee e1 = new Employee(MemberJob.Employee, "Name", MemberSkills.CPlus, true,
"Do this Job", 5);
Employee e2 = new Employee(MemberJob.Employee, "Another name", MemberSkills.CSharp, true,
"Do another Job", 2);
结果
我提供的代码目前发生的情况是,在 Another name
完成轮班(2 个轮班)后,他们会 运行 返回 free
列表框,它们从 occupied
列表框中消失,这正是我想要的,然后在 Name
完成后,它们会放回 free
但 another name
显示两次。
可能的解决方案
我可以这样,如果这个名字在 free
上显示了不止一次,它就会被删除,只显示一次,但这很混乱,我可以想象如果一个员工的名字与另一个这会引起冲突。
完成第一个循环的逻辑工作,而不是在您仍在 运行 循环时尝试更新列表。清除两个列表后在循环 DisplayData 结束时。
private void btnCycle_Click(object sender, EventArgs e)
{
foreach (Employee emp in employees)
{
if (emp.Busy)
{
emp.ShiftsLeft--;
emp.Busy = emp.ShiftsLeft > 0;
// Do not try to update here
// finish the logic loop and...
}
}
}
// Clear the content of both lists
lstFree.Items.Clear();
lstOccupied.Items.Clear();
// Now rebuild both lists
DisplayData(employees);
如果您想删除员工列表上的双循环,您可以在开始第一个循环之前清除两个列表框,并在确定每个员工的忙碌状态后立即重新添加条目
private void btnCycle_Click(object sender, EventArgs e)
{
// Clear the content of both lists
lstFree.Items.Clear();
lstOccupied.Items.Clear();
foreach (Employee emp in employees)
{
if (emp.Busy)
{
emp.ShiftsLeft--;
if (emp.ShiftsLeft == 0)
{
lstFree.Items.Add(emp);
emp.Busy = false;
}
else
lstOccupied.Items.Add(emp);
}
}
}
当然,在此上下文中您不再调用 DisplayData。