如何强制超网格列公式刷新

本文关键字:刷新 网格 何强制 | 更新日期: 2023-09-27 18:13:16

我使用一个数字上下控件来允许用户调整数值来影响我的超网格的变化。在我的ultragrid InitializeLayout事件中,我有以下内容:

...
   var band = e.Layout.Bands[0];
   band.Columns["CalcMarkup"].Formula = "if ([Markup] > 0, [FinalCost]*([Markup]/100), 0)";
   band.Columns["RemainingCost"].Formula = "if([CalcMarkup] > 0, 0, [FinalCost] )";
   band.Columns["ForcedMarkup"].Formula = "if([RemainingCost] = 0, 0, ([RemainingCost]/[sumRemCost()])*[force()])";
...
   grdMain.DisplayLayout.Bands[0].Summaries.Add("force", "[ForcedAdj()]", SummaryPosition.UseSummaryPositionColumn, grdMain.DisplayLayout.Bands[0].Columns["ForcedMarkup"]);
...
   var value = 1 - (nudMarginPer.Value/100);
   _marginFormula = string.Format("( ( ([finCost()]/{0})-sum([FinalCost]) )-sum([CalcMarkup])-5000000 )", "{0}");  
   band.Summaries.Add("ForcedAdj", string.Format(_marginFormula, value));
   band.Summaries["ForcedAdj"].SummaryDisplayArea = SummaryDisplayAreas.None;
...
   grdMain.DisplayLayout.Bands[0].Summaries.Add("force", "[ForcedAdj()]", SummaryPosition.UseSummaryPositionColumn, grdMain.DisplayLayout.Bands[0].Columns["ForcedMarkup"]);

:

    void nudMarginPer_ValueChanged(object sender, EventArgs e)
    {
        var value = 1 - (nudMarginPer.Value/100);
        grdMain.DisplayLayout.Bands[0].Summaries["ForcedAdj"].Formula = string.Format(_marginFormula, value);
    }

当用户按下上下按钮时,摘要(ForceAdj)值会发生变化,并反映在网格摘要行中。然而,ForcedMarkup的列公式直到第二次按下按钮才改变。现在总结是正确的,但是单元格中的值是off。

我的问题是……如何强制ForcedMarkup公式(或任何列公式)刷新以反映当前计算?

我已经尝试强制网格更新,calcmanager召回等…

   *** 7/20:  This appears to be an issue when using group by.

如何强制超网格列公式刷新

根据我的经验,这可能是calcmanager的把戏。

Calcmanager recalc()方法只强制对已脏的公式重新计算,因此您应该先脏它们。

同样,如果DeferredCalculationsEnabled属性设置为true, calcmanager可以延迟重新计算,直到公式单元格(或整个网格)变得可见。

这就是我的工作:

1。如果datagrid还不可见例如,试图获得计算列/摘要的值,而仍然在形式构造函数

calcmanager_instance.DeferredCalculationsEnabled = false;
calcmanager_instance.ReCalc();

2。如果datagrid已经可见,但是公式需要重新计算

calcmanager_instance.DirtyAllFormulas();
calcmanager_instance.ReCalc();

通常,这种组合应该无条件地立即强制重新计算所有公式:

calcmanager_instance.DeferredCalculationsEnabled = false;
calcmanager_instance.DirtyAllFormulas();
calcmanager_instance.ReCalc();

我想,一定有一种方法可以只脏选定的公式,但我没有寻找它