WPF foreach 文本框循环
本文关键字:循环 文本 foreach WPF | 更新日期: 2023-09-27 18:17:16
我试图理解为什么这段代码不起作用。
有人可以帮忙吗?
foreach (TextBox replyBox in textboxPanel.Children.OfType<TextBox>())
{
if (replyBox.Name.Contains("Reply"))
{
textboxPanel.Children.Remove(replyBox);
}
}
它返回一条消息,指出类型已更改。
我看过其他一些使用panel.controls
的帖子,但不知何故我的面板没有。
问候
基本的 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()
创建的列表。
您正在尝试从迭代集合中删除一个项目,而不是尝试收集您希望删除的所有文本框,然后循环访问它们并从textboxPanel
中逐个删除,如下所述:
尝试这样的事情:
var textBoxesToRemove = textboxPanel.Children.OfType<TextBox>().Where(x => x.Name.Contains("Reply"));
foreach (TextBox txtToRemove in textBoxesToRemove)
{
textboxPanel.Children.Remove(txtToRemove);
}
从用于迭代的同一集合中删除可能会产生问题。你可以这样做:
var childerns = textboxPanel.Children.OfType<TextBox>();
foreach (TextBox replyBox in childerns)
{
if (replyBox.Name.Contains("Reply"))
{
textboxPanel.Children.Remove(replyBox);
}
}