【发布时间】:2022-01-02 10:16:44
【问题描述】:
我有一个网格,我正在尝试删除特定行中的项目。它在一个循环中,然后当它转到第二行时,它会删除第二行中的项目,并删除第一行中的项目。如何调整以仅删除我想要的行?
请注意,我要做的是将第一行复制到第二行,仅解决 pow (b²),在第三行中我将复制第二行,但解决 -4 * 5 (-4 *一)。
这是正在发生的事情的预览。
This 是我扩充这些行的代码,以了解:
它首先进入if(fields == null),因为是pow,然后进入else:
for (int i = 0; i < qntLines; i++)
{
string field = lines[i].Substring(0, lines[i].IndexOf('#'));
string operation = lines[i].Substring(lines[i].IndexOf('#') + "#".Length);
CreateResultLine(field, operation, i, listTexts);
}
private void CreateResultLine(string field, string operation, int i, List<string> listTexts)
{
string[] fields = null;
List<string> texts = new List<string>();
string text = string.Empty;
dynamic textResult;
int count = new int();
if (field.Contains(','))
fields = field.Split(',', (char)StringSplitOptions.RemoveEmptyEntries);
if (fields == null)
{
text = listTexts[int.Parse(field)];
text = RemovePow(text);
texts.Add(text);
textResult = ExecuteOperation(texts, operation);
gridFrame.Children.RemoveAt(int.Parse(field) + 1);
gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center,
TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, int.Parse(field) + 1, i);
}
else
{
foreach (var item in fields)
{
string noPow = string.Empty;
noPow = RemovePow(listTexts[int.Parse(item)]);
texts.Add(noPow);
++count;
}
textResult = ExecuteOperation(texts, operation);
for (int i2 = int.Parse(fields[0]); i2 <= int.Parse(fields[1]);)
{
gridFrame.Children.RemoveAt(int.Parse(fields[0]));
++i2;
}
gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center,
TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, int.Parse(fields[0]) + 1, i);
}
}
【问题讨论】:
-
我没有研究过你的代码,但我会做一个一般性的评论:与其试图操纵
gridFrame.Children,为什么不简单地设置someItem.IsVisible = false;,其中someItem是网格单元格你想隐藏吗?然后为了显示不同的结果,有一个不同的项目,以IsVisible = false开头,更新它的文本,然后设置它的IsVisible=true。对我来说,操纵视图的可见性比按摩布局的子级更容易。 -
另一个想法:当你创建每个项目时,如果你以后需要访问它,然后以某种方式“记住”它。如果在 xaml 中创建了一个网格行,您可以给它一个
x:name属性。如果在 c# 中创建了一个网格行,那么您可以使用您想要记住的那些创建一个列表字段(因此很容易知道正确的索引),或者您可以使用给定的键添加到字典中,以找到它稍后通过键字符串。无论哪种方式,您都不再需要 循环 遍历孩子。您直接转到您关心的项目。 -
现在看看你的代码有什么问题。我不打算详细阅读,但有一个事实让我眼前一亮。当您执行多个
RemoveAts 时,一旦删除第一个,就会更改所有索引以供以后使用RemoveAts。一种解决方法:“最后一个”删除它们。一种方法是反转循环:从最高索引开始并使用递减--。 (而不是从具有增量的最低索引开始。)另一种解决方案是,当您找到要删除的每个项目时,不要删除它。将其放入“toRemove”列表中。然后,当您找到所有这些时,在每个上使用Remove。 -
对于您的最后一条评论,您能给我看一些代码示例吗?我不明白我怎么能像你说的那样做。
-
我添加了一个答案,显示了更好的方法。
标签: c# xamarin xamarin.forms dynamic grid