因为我正在寻找不是每列的每一行的最大值和最小值,我的问题不是重复的 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;
}
}
}
}
答案 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;
}
}