如何在c#中创建两个数据视图之间的公式

本文关键字:视图 数据 两个 之间 创建 | 更新日期: 2023-09-27 18:10:11

如何连接两个数据网格视图,以便它们的数据自动更新。例如:当DataGridView1中的collmb1增加时,DatagridView2中的collmb2也增加。

如何在c#中创建两个数据视图之间的公式

分享我的想法来实现一个解决方案,其中更改单元格中的值会更新另一个值

首先,创建一个类似CellRelation的类——它的目的是建立两个网格单元之间的关系。

  class CellRelation
  {
     DataGridCell SourceCell;
     DataGridCell DestinationCell;
     Func<DataGridCell, DataGridCell, decimal> Formula;      
  }

其次,初始化

  1. 按当前方式填充网格

  2. 对于所有你希望有公式的网格单元格,创建一个CellRelation &添加它做一个集合- CellRelations

  3. 当你创建CellRelation的实例时->为它提供源单元格,目标单元格和委托。

例如在您的情况下,如果您想计算剩余库存-

源单元将是Sold Inventry,目标单元将是剩余的库存单元。

公式(委托):我认为这个委托期望2个网格单元格作为输入,并给出十进制的结果。

输入网格单元格将是"TotalInventoryCell" &"SoldInvenoryCell"这个委托会是一个减去给定单元格值的函数。委托的返回将是一个十进制值,您可以使用该值更新剩余的库存单元

第三,更新网格1中的单元格的事件。

  1. 当网格中单元格的值发生变化时,处理相应的事件。在此事件处理程序中,遍历集合CellRelations,以查找是否存在需要根据输入的公式更新其值的从属单元格。

  2. 如果您发现要更新的单元格的条目,则执行委托(公式)并使用委托(公式)返回的十进制值来更新目标单元格的值

如果您认为某些部分不清楚,请告诉我,我会尽量提供样品


工作示例

我做了一个简短的工作样本(没有数据集)来演示我的方法。我做了一个只有一行的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技术的。如果您需要一个位于单独业务层的示例,请给我写注释。