You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:04