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,提问作者علاء الدماصي
相关产品推荐
相关产品推荐

