【问题标题】:How to force ultragrid column formula refresh?如何强制刷新超网格列公式?
【发布时间】:2014-07-17 11:59:25
【问题描述】:

我使用数字 updown 控件来允许用户调整数值以影响我的 ultragrid 的变化。在我的 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"]);

在数字 updown 事件中:

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

这很有效,因为当用户按下 updown 按钮时,摘要 (ForceAdj) 值会发生变化并反映在网格摘要行中。但是,ForcedMarkup 的列公式在按下第二个按钮之前不会改变。所以现在摘要是正确的,但是单元格中的值是关闭的。

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

我尝试过强制更新网格、重新计算 calcmanager 等...似乎没有任何效果。

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

【问题讨论】:

    标签: c# infragistics


    【解决方案1】:

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

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

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

    这对我有用:

    1.如果数据网格还不可见 例如,尝试在表单构造函数中获取计算列/摘要的值

    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();
    

    我想,一定有办法只弄脏选定的公式,但我没有寻找它。

    【讨论】:

    • 事实证明这是一个带有 ingragistics 的错误(分组依据),他们为它创建了一个补丁。我认为它将在下一个服务版本中推出。
    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多