我使用数字更新控件允许用户调整数值以实现超网格中的更改。在我的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.
答案 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();
我认为,必须有一种方法只弄脏选定的公式,但我没有找到它。