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