C# C数据表每行(而不是每列)的最小值和最大值

C# C数据表每行(而不是每列)的最小值和最大值,c#,datatable,C#,Datatable,因为我在寻找每一行的最大值和最小值,而不是每一列的最大值和最小值,所以我的问题不是重复的 我正在制作一个数据表表单。我在同一行的合计计算中遇到问题。最终目标是获得此计算: Maxcol1,col2,col3,col4-Mincol1,col2,col3,col4 使用此代码可以将同一行的两个值相加; dt.Columns.AddExpression列,类型为double,Col1+Col2 我得到的错误是 我尝试过这个,但出现了一个错误 dt.Columns.Add("Coreshift",

因为我在寻找每一行的最大值和最小值,而不是每一列的最大值和最小值,所以我的问题不是重复的

我正在制作一个数据表表单。我在同一行的合计计算中遇到问题。最终目标是获得此计算: Maxcol1,col2,col3,col4-Mincol1,col2,col3,col4

使用此代码可以将同一行的两个值相加; dt.Columns.AddExpression列,类型为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表达式页面

用新代码更新

 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;
        }
    }








}

}下面是一个非常小而愚蠢的示例,它演示了如何使用RowChanged处理程序进行计算。 如果您使用复杂的dataset/datatable/dataview功能,这可能会给您带来其他问题,但是如果您主要在一个datagridview中使用一个datatable,我认为这可能会起作用

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;
    }
}

datatable表达式中的Max和Min方法仅用于聚合相关表中的所有行。在这里,您最好的办法可能是使用RowChanged事件,不幸的是,这里有一个与javajtable.getValueAtrow、coltable.Rows[row][col]类似的c等价物,我已经想出了一个类似的解决方案。但是,我在更新Calc列时遇到了问题。有什么问题吗?该列不更新吗?您的事件处理程序不会触发?在我制作示例时,我注意到您不能在datatable中将计算列设置为只读,如果设置为只读,则无法更新它。不过,您可以在网格中将其设置为只读,这就是我在示例中所做的;更新时,我得到了一个堆栈溢出错误。您看到我的代码中关于避免无限循环的注释了吗?更新计算列时会再次触发RowChanged事件,这就是堆栈溢出的原因