如何在c#中创建两个数据视图之间的公式
本文关键字:视图 数据 两个 之间 创建 | 更新日期: 2023-09-27 18:10:11
如何连接两个数据网格视图,以便它们的数据自动更新。例如:当DataGridView1中的collmb1增加时,DatagridView2中的collmb2也增加。
分享我的想法来实现一个解决方案,其中更改单元格中的值会更新另一个值
首先,创建一个类似CellRelation的类——它的目的是建立两个网格单元之间的关系。
class CellRelation
{
DataGridCell SourceCell;
DataGridCell DestinationCell;
Func<DataGridCell, DataGridCell, decimal> Formula;
}
其次,初始化
按当前方式填充网格
对于所有你希望有公式的网格单元格,创建一个CellRelation &添加它做一个集合- CellRelations
- 当你创建CellRelation的实例时->为它提供源单元格,目标单元格和委托。
例如在您的情况下,如果您想计算剩余库存-
源单元将是Sold Inventry,目标单元将是剩余的库存单元。
公式(委托):我认为这个委托期望2个网格单元格作为输入,并给出十进制的结果。
输入网格单元格将是"TotalInventoryCell" &"SoldInvenoryCell"这个委托会是一个减去给定单元格值的函数。委托的返回将是一个十进制值,您可以使用该值更新剩余的库存单元
。第三,更新网格1中的单元格的事件。
当网格中单元格的值发生变化时,处理相应的事件。在此事件处理程序中,遍历集合CellRelations,以查找是否存在需要根据输入的公式更新其值的从属单元格。
如果您发现要更新的单元格的条目,则执行委托(公式)并使用委托(公式)返回的十进制值来更新目标单元格的值
如果您认为某些部分不清楚,请告诉我,我会尽量提供样品
工作示例
我做了一个简短的工作样本(没有数据集)来演示我的方法。我做了一个只有一行的datagridview & &;3栏-总数,已售出&;剩余的
因此,每次对Sold单元格进行更改时,其余项都会得到更新。
我用单个网格制作,但同样可以扩展为2网格。它有很大的改进空间,特别是表达式部分,理想情况下,它应该能够评估表达式树。
class CellRelation
{
public DataGridViewCell SourceCell;
public DataGridViewCell DestinationCell;
public CellFormula Formula;
}
class CellFormula
{
public Func<DataGridViewCell, DataGridViewCell, decimal> Operator;
public DataGridViewCell Operand1;
public DataGridViewCell Operand2;
public decimal Evaluate()
{
return Operator(Operand1, Operand2);
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<CellRelation> cellRelations = new List<CellRelation>();
private void Initialise_Click(object sender, EventArgs e)
{
var soldCell = this.dataGridView1[1, 0];
var remainingCell = this.dataGridView1[2, 0];
var totalCell = this.dataGridView1[0, 0];
// datagid values --- In your case this is from a dataset
totalCell.Value = 10;
soldCell.Value = 0;
remainingCell.Value = 10;
// initialise the relation / formula
CellRelation relation = new CellRelation();
relation.SourceCell = soldCell;
relation.DestinationCell = remainingCell; // thats the dependent cell
relation.Formula = new CellFormula();
// here is a sample of subtraction formula : Subtracting Sold items for total items
relation.Formula.Operator = new Func<DataGridViewCell, DataGridViewCell, decimal>((p, v) => { return ((decimal.Parse(p.Value.ToString()))) - ((decimal.Parse(v.Value.ToString()))); });
relation.Formula.Operand1 = totalCell;
relation.Formula.Operand2 = soldCell;
cellRelations.Add(relation);
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//look up if there is an destination cell for the cell being updated
var cellReln = cellRelations.FirstOrDefault(item => item.SourceCell.RowIndex == e.RowIndex && item.SourceCell.ColumnIndex == e.ColumnIndex);
if (cellReln != null)
{
cellReln.DestinationCell.Value = cellReln.Formula.Evaluate();
}
}
}
编辑:请注意-我建议的方法是使用CellRelation &CellFormula有DataGridViewCell类型的属性。因此,它与UI技术(在本例中是winform)紧密绑定。理想情况下,这种解决方案应该是独立于UI技术的。如果您需要一个位于单独业务层的示例,请给我写注释。