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

Xamarin中如何对Grid内同行或多列单元格求和?Grid是否适用?

问题解决方案

Grid是否适合该需求?

Grid完全适合展示行列结构的数值数据并实现运算需求,但当前实现的问题在于没有给每个Entry标记对应的行/列信息,导致后续难以定位目标控件。只需要给Entry附加行、列标识,就能轻松实现各类运算。

具体实现步骤

1. 给Entry添加行、列标识

在创建Entry时,利用Tag属性存储对应的行号和列号,这样后续可以通过Tag快速定位控件所属的行和列:

for (int i = 0; i < dt.Rows.Count; i++)
{
    for (int num = 0; num < dt.Columns.Count; num++)
    {
        Entry entry = new Entry();
        entry.Text = dt.Rows[i][num].ToString();
        // 其他属性设置...
        // 存储行号i和列号num到Tag中
        entry.Tag = new Tuple<int, int>(i, num);
        entry.TextChanged += MyEntry_TextChanged;
        MainGrid.Children.Add(entry, num, i);
    }
}

2. 实现行内加减乘运算

通过遍历Grid的子控件,筛选出目标行的所有Entry,解析数值后执行运算。以下示例为计算某行前两列的和并赋值给第三列:

// 计算指定行的行内运算(以加法为例)
private void CalculateRowOperation(int rowIndex)
{
    Entry col1Entry = null;
    Entry col2Entry = null;
    Entry resultEntry = null;

    foreach (var child in MainGrid.Children)
    {
        if (child is Entry entry && entry.Tag is Tuple<int, int> pos && pos.Item1 == rowIndex)
        {
            switch (pos.Item2)
            {
                case 0: col1Entry = entry; break;
                case 1: col2Entry = entry; break;
                case 2: resultEntry = entry; break;
            }
        }
    }

    if (col1Entry != null && col2Entry != null && resultEntry != null)
    {
        if (double.TryParse(col1Entry.Text, out double val1) && double.TryParse(col2Entry.Text, out double val2))
        {
            // 可替换为val1 - val2(减法)或val1 * val2(乘法)
            resultEntry.Text = (val1 + val2).ToString("F2");
        }
    }
}

如果需要实时运算,可以在MyEntry_TextChanged事件中触发:

private void MyEntry_TextChanged(object sender, TextChangedEventArgs e)
{
    if (sender is Entry entry && entry.Tag is Tuple<int, int> pos)
    {
        // 当当前行的Entry内容变化时,自动计算该行运算结果
        CalculateRowOperation(pos.Item1);
    }
}

3. 实现单列/多列求和

单列求和

遍历Grid子控件,筛选出目标列的所有Entry并求和:

// 计算指定列的数值总和
private double CalculateColumnSum(int colIndex)
{
    double total = 0;
    foreach (var child in MainGrid.Children)
    {
        if (child is Entry entry && entry.Tag is Tuple<int, int> pos && pos.Item2 == colIndex)
        {
            if (double.TryParse(entry.Text, out double value))
            {
                total += value;
            }
        }
    }
    return total;
}

多列求和

传入需要求和的列索引列表,遍历筛选后累加:

// 计算多个指定列的数值总和
private double CalculateMultiColumnSum(List<int> targetColIndexes)
{
    double total = 0;
    foreach (var child in MainGrid.Children)
    {
        if (child is Entry entry && entry.Tag is Tuple<int, int> pos && targetColIndexes.Contains(pos.Item2))
        {
            if (double.TryParse(entry.Text, out double value))
            {
                total += value;
            }
        }
    }
    return total;
}

可选优化方案

如果希望更便捷地管理数据和运算,也可以使用Xamarin Community Toolkit的DataGrid控件,通过数据绑定将DataTable转为ObservableCollection,运算逻辑可直接在数据模型中实现,无需手动创建Entry控件,代码维护性更强。但如果不想引入第三方控件,上述Grid的方案已完全满足需求。

内容的提问来源于stack exchange,提问作者علاء الدماصي

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:30:57