WPF foreach文本框循环

时间:2016-11-10 04:37:35

标签: c# wpf

我试图理解为什么这段代码不起作用。

有人可以帮忙吗?

        foreach (TextBox replyBox in textboxPanel.Children.OfType<TextBox>())
        {
            if (replyBox.Name.Contains("Reply"))
            {
                textboxPanel.Children.Remove(replyBox);
            }
        }

它会返回一条消息,说明类型已更改。

我已经看过其他一些使用panel.controls的帖子,但是我的面板不知道如何。

的问候,

3 个答案:

答案 0 :(得分:3)

基本的foreach循环是不可变的。

https://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx

  

foreach语句用于遍历集合以获取所需的信息,但不能用于添加或删除源集合中的项目以避免不可预测的副作用。如果需要在源集合中添加或删除项目,请使用for循环。

我会这样解决你的问题:

rootPanel.Children.OfType<TextBox>().ToList()
            .ForEach(item =>
            {
                if (item.Text.Contains("Reply"))
                {
                    rootPanel.Children.Remove(item);
                }
            });

你也可以使用LINQ:

rootPanel.Children.OfType<TextBox>()
            .Where(textbox => textbox.Text.Contains("Reply"))
            .ToList().ForEach(item => rootPanel.Children.Remove(item));

这可行的原因是因为您正在遍历由ToList()创建的列表。

答案 1 :(得分:1)

您正在尝试从迭代集合中删除一个项目,而不是您可以尝试收集您将要删除的所有文本框,然后迭代它们并从textboxPanel中逐个删除,如下所述:

尝试这样的事情:

var textBoxesToRemove = textboxPanel.Children.OfType<TextBox>().Where(x => x.Name.Contains("Reply"));
foreach (TextBox  txtToRemove in textBoxesToRemove)
{
    textboxPanel.Children.Remove(txtToRemove);
}

答案 2 :(得分:0)

从已用于迭代的同一集合中删除可能会产生问题。你可以这样做:

var childerns = textboxPanel.Children.OfType<TextBox>();
foreach (TextBox replyBox in childerns)
        {
            if (replyBox.Name.Contains("Reply"))
            {
                textboxPanel.Children.Remove(replyBox);
            }
        }