我想在中添加公式单元格DataGridView
。有什么习惯DataGridView
可以做到这一点吗?
例:
grid[4, column].Text = string.Format("=MAX({0}6:{0}{1})", columnAsString, grid.RowCount);
是否有任何自定义DataGridView可以做到这一点?
脱离主题,但是如果您正在寻找自定义控件,请查看Free .NET Spreadsheet Control。它还支持公式。
如果编写计算代码适合您
如果编写计算代码是您的选择,则要基于其他一些单元格的值来计算单元格的值,可以使用CellFormatting
event ofDataGridView
并将计算逻辑放在此处。还应处理CellEndEdit
并调用InvalidateCell
或Invalidate
在参考单元格中的每个单元格之后强制更新该单元格的值。
这是一个例子:
void Form1_Load(object sender, EventArgs e)
{
Random r = new Random();
var dt = new DataTable();
dt.Columns.Add("A", typeof(int));
dt.Columns.Add("B", typeof(int));
for (int i = 0; i < 10; i++)
dt.Rows.Add(r.Next(100));
grid.DataSource = dt;
grid.CellFormatting += grid_CellFormatting;
grid.CellEndEdit += grid_CellEndEdit;
}
void grid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
grid.Invalidate();
}
void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
var grid = sender as DataGridView;
var parameterColumnName = "A"; //Parameter column name
var start = 0; //Start row index for formula
var end = grid.RowCount - 1; //End row index for formula
var resultRowIndex = 0; //Result row index
var resultColumnName = "B"; //Result column name
if (e.RowIndex == resultRowIndex &&
grid.Columns[e.ColumnIndex].Name == resultColumnName)
{
var list = Enumerable.Range(start, end - start + 1)
.Select(i => grid.Rows[i].Cells[parameterColumnName].Value)
.Where(x => x != null && x != DBNull.Value)
.Cast<int>();
if (list.Any())
e.Value = list.Max();
}
}
注意
该解决方案不仅限于DataTable
,无论DataSource
您使用哪种解决方案都可以使用,DataGridView
并且可以在此解决方案中使用任何类型的数据源。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句