1

我有一个 FlowLayoutPanel,我想用 ID(字符串)列表中的 ProgressBars 和当前进度条(整数)的位置来更新它。我将这个列表称为列表a

FlowLayoutPanel.Controls应该与列表a进行比较:

  • 如果检测到新 ID,则应在FlowLayoutPanel.Controls集合中使用该 ID(名称)创建一个新控件。
  • 如果集合中的 Control 在列表aFlowLayoutPanel.Controls中没有对应的名称,则应将其删除并处置。
  • 应该更新两个集合上的控件(ProgressBar 的进度来自列表a中的整数)

令我困扰的是该FlowLayoutPanel.Controls集合没有通用列表那么多的方法,因此我无法真正遵循互联网上的任何指南。

你能帮我怎么做吗?

谢谢!

编辑:回复 DJ KRAZE 评论:我用列表做了类似的事情,但正如我所说,控制集合没有列表的某些方法。这是我的代码(可能不起作用,我重写了它以使其更易于理解):

// 删除旧的

// Make a new list of IDs, where none of the IDs from myList1 can be found in myList2
var remove = myList1.Where(f => !myList2.Any(g => g == f.ID));

//Do some operation for the object which is about to get removed
foreach (Object obj in remove)
{
    // Some operation           
}
// remove from list
myList1.RemoveAll(i => remove.Contains(i));

//删除重复项

// Remove Duplicates from myList2, so only the remaining object are to be started
myList2.RemoveAll(f => myList2.Any(g => g.ID == f));

// 将剩余的对象从 myList2 添加到 myList1

foreach(Object obj in myList2)
{
// add to myList1 and do some operation, like starting it
}
4

2 回答 2

3

包括System.Linq所有扩展方法。

于 2012-12-19T16:18:12.527 回答
1

FlowLayoutPanel(以及其他容器控件)的控件集合不实现IEnumerable<T>,而仅实现非泛型IEnumerable. 因此转换IEnumerableIEnumerable<T>Cast<T>exension方法。然后你可以使用大量的 LINQ:

 flowLayoutPanel1.Controls
     .Cast<Control>()
     .Where(c => c.Name == "...")
     .OrderBy(...)
     ...

注意:大多数 LINQ 扩展方法都扩展了IEnumerable<T>.

于 2012-12-19T16:47:04.003 回答