如何强制ultragrid列公式刷新?

时间:2014-07-17 11:59:26

标签: c# infragistics

我使用数字更新控件允许用户调整数值以实现超网格中的更改。在我的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的列公式在按下第二个按钮之前不会更改。所以现在摘要是正确的,但是单元格中的值是关闭的。

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

我尝试过强制网格更新,calcmanager recalc等等......似乎没什么用。

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

1 个答案:

答案 0 :(得分:3)

根据我的经验,这可能是calcmanager的伎俩。

Calcmanager recalc()方法只强制重新计算脏污的公式,所以你应该先弄脏它们。

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

这对我有用:

<强> 1。如果datagrid不可见 例如,仍然在表单构造函数

中尝试获取计算列/摘要的值
calcmanager_instance.DeferredCalculationsEnabled = false;
calcmanager_instance.ReCalc();

2.如果数据网格已经可见,但公式需要重新计算

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

一般,此组合应无条件立即强制重新计算所有公式:

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

我认为,必须有一种方法只弄脏选定的公式,但我没有找到它。