C#DataTable动态地显示每行(不是每列)的最小值和最大值

时间:2018-04-23 21:01:49

标签: c# datatable

因为我正在寻找不是每列的每一行的最大值和最小值,我的问题不是重复的 https://stackoverflow.com/questions/2442525/how-to-select-min-and-max-values-of-a-column-in-a-datatable

我正在处理DataTable表单。我在同一行中遇到聚合计算问题。最终目标是得到这个计算: (Max(col1,col2,col3,col4) - Min(col1,col2,col3,col4))

使用此代码可以添加同一行的两个值;      dt.Columns.Add(" Expression列",typeof(Double)," Col1 + Col2");

我得到的错误是

我试过这个但是收到错误

 dt.Columns.Add("Coreshift", typeof(Double), "max(Col1 ,Col2,Col3,Col4");
dt.Columns.Add("Coreshift", typeof(Double), "max(Dt.Col1 ,Dt.Dt.Col2,Dt.Col3,Dt.Col4");

聚合参数中的语法错误:期望单个列参数可能带有' Child' 。限定符'

由于我想动态地执行此操作,我已考虑将每个行值放入数组中,但是我不确定如何通过单击按钮来执行此操作。

我引用了msdn表达式页面 C# DataColumn expression

更新了新代码。

 private static void Row_Changed(object sender, DataRowChangeEventArgs e)
    {

        int RowIndex = e.Row.Table.Rows.IndexOf(e.Row);




        Console.WriteLine("Row_Changed Event: a={0},b={1},c={2},d={3},e ={4}; actaion={1}",
    e.Row["Sw1"], e.Row["Sw2"], e.Row["Sw3"], e.Row[3], e.Row[4]);

        double[] scores = new double[] {(double)e.Row["Sw1"], (double)e.Row["Sw2"], (double)e.Row["Sw3"], (double)e.Row["Sw4"] };
        double x = scores.Max();
        Console.WriteLine("Max");
        Console.WriteLine(x);
        Console.WriteLine("Row index");
        Console.WriteLine(RowIndex);



    }

当我使用您的代码时,我无法让您的表格创建行和列,我确信它的内容很简单。我已经陷入了沉迷于疯狂的模式。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace a
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = new GridForm();


    }



    class GridForm : Form
    {
        private DataTable _table = new DataTable();
        private DataGridView _grid = new DataGridView();

        public GridForm()
        {
            _table.Columns.Add("Col1", typeof(double));
            _table.Columns.Add("Col2", typeof(double));
            _table.Columns.Add("Col3", typeof(double));
            _table.Columns.Add("Col4", typeof(double));

            var calcCol = _table.Columns.Add("Calc", typeof(double));
            calcCol.DefaultValue = 0.0d;
            _table.RowChanged += (sender, args) =>
            {

                // 4 first columns as doubles
                var vals = args.Row.ItemArray.Take(4).Cast<double>().ToArray();
                var calc = vals.Max() - vals.Min();

                // Only set if changed to avoid infinite loop
                if (!double.Equals(args.Row["Calc"], calc))
                {
                    args.Row["Calc"] = calc;
                }
            };

            _table.LoadDataRow(new object[] {
        1d, 1d, 3d, 4d
    }, true);
            _table.LoadDataRow(new object[] {
        2d, 2d, 5d, 6d
    }, true);

            Controls.Add(_grid);
            _grid.DataSource = _table;
            _grid.Columns["Calc"].ReadOnly = true;
            _grid.Dock = DockStyle.Fill;
            _grid.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
            _grid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            _grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        }
    }








}

}

1 个答案:

答案 0 :(得分:1)

这是一个非常小而愚蠢的例子,说明了如何使用RowChanged处理程序进行计算。 如果您使用复杂的数据集/数据表/数据视图功能,这可能会给您带来其他问题,但如果您主要在一个datagridview中使用一个数据表,我认为这可能会有效。

class GridForm : Form
{
    private DataTable _table = new DataTable();
    private DataGridView _grid = new DataGridView();    

    public GridForm()
    {
        _table.Columns.Add("Col1", typeof(double));
        _table.Columns.Add("Col2", typeof(double));
        _table.Columns.Add("Col3", typeof(double));
        _table.Columns.Add("Col4", typeof(double));

        var calcCol = _table.Columns.Add("Calc", typeof(double));
        calcCol.DefaultValue = 0.0d;
        _table.RowChanged += (sender, args) =>
        {

            // 4 first columns as doubles
            var vals = args.Row.ItemArray.Take(4).Cast<double>().ToArray();
            var calc = vals.Max() - vals.Min();

            // Only set if changed to avoid infinite loop
            if (!double.Equals(args.Row["Calc"], calc))
            {
                args.Row["Calc"] = calc;
            }
        };

        _table.LoadDataRow(new object[] {
            1d, 1d, 3d, 4d
        }, true);
        _table.LoadDataRow(new object[] {
            2d, 2d, 5d, 6d
        }, true);

        Controls.Add(_grid);
        _grid.DataSource = _table;
        _grid.Columns["Calc"].ReadOnly = true;
        _grid.Dock = DockStyle.Fill;
        _grid.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
        _grid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
        _grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }
}