Xamarin开发:如何删除Grid控件中指定行内的特定元素?
问题原因分析
- 核心问题出在删除Grid子元素时的索引处理逻辑错误:Grid的
Children集合是动态结构,每删除一个元素,位于它后方的所有元素索引都会自动减1,继续使用原始固定索引删除必然会命中错误目标。 else分支的删除逻辑存在明显bug:循环内每次都固定删除int.Parse(fields[0])位置的元素,比如你要删除索引1和2的两个元素,第一次删索引1后,原本索引2的元素会变成新的索引1,第二次循环再删索引1就会误删原本属于上一行的元素,这就是第一行内容被连带删除的直接原因。- 边计算边修改UI的逻辑也放大了索引偏移问题,前一步的UI修改会直接导致后续所有索引计算失效。
修复方案
调整核心逻辑,删除多元素时从后往前操作,避免未删除元素的索引受影响,同时增加索引合法性校验避免越界报错,修改后的代码如下:
// 外层循环逻辑不变 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>(); dynamic textResult; if (field.Contains(',')) fields = field.Split(',', StringSplitOptions.RemoveEmptyEntries); if (fields == null) { int targetIdx = int.Parse(field); texts.Add(RemovePow(listTexts[targetIdx])); textResult = ExecuteOperation(texts, operation); // 增加索引合法性校验 int removePos = targetIdx + 1; if (removePos >= 0 && removePos < gridFrame.Children.Count) { gridFrame.Children.RemoveAt(removePos); } gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, targetIdx + 1, i); } else { foreach (var item in fields) { texts.Add(RemovePow(listTexts[int.Parse(item)])); } textResult = ExecuteOperation(texts, operation); int startIdx = int.Parse(fields[0]); int endIdx = int.Parse(fields[1]); // 重点:从后往前删除,避免索引偏移 for (int i2 = endIdx; i2 >= startIdx; i2--) { if (i2 >= 0 && i2 < gridFrame.Children.Count) { gridFrame.Children.RemoveAt(i2); } } gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, startIdx + 1, i); } }
额外优化建议
如果后续业务逻辑更复杂,建议先跑完所有计算逻辑,再统一对Grid的UI做增删操作,不要边计算边修改UI,能最大程度避免索引错乱问题。
内容的提问来源于stack exchange,提问作者techie
相关产品推荐
相关产品推荐

