Home > Software design >  Use Last Value in Column for Summary Instead of SUM
Use Last Value in Column for Summary Instead of SUM

Time:03-30

I have following code to remove the summary row/band value on a retrieve UI event. I'm certain this is the wrong way to do it but it works.

public UiEventResult AfterRetrieveData_111(object sender, RetrieveDataEventArgs e)
    {
        UltraGridBase baseGrid = _view.ViewGrids["ultraGrid1"];
        UltraGridLayout gridLayout = baseGrid.DisplayLayout;
        
        for (int i = 0; i < 2; i  )
        {
            gridLayout.Bands[i].Columns["columnA"].Formula = "''";
        }
        for (int i = 0; i < 3; i  )
        {
            gridLayout.Bands[i].Columns["columnB"].Formula = "''";
            gridLayout.Bands[i].Columns["columnC"].Formula = "''";
        }

Is there a way to program the retrieve so that it populates the summary row for column A/band[2] so that is uses the last value in each column? Without the above code it will sum rows under but would like for a way for it to use the last row value instead. Data will always be sorted DESC by date so last row will always be the value needed...

enter image description here

CodePudding user response:

One way to achieve this is in InitializeRowEvent by setting the value of the columnA to the value of the last row in the child band like this:

// Update the rows only in the first band. You can also use e.Row.Band.Key == {YOU_BAND_KEY}
if (e.Row.Band.Index == 0)
{
    // set the value of the columnA to the value of the last row in the child band
    e.Row.Cells["columnA"].Value = e.Row.ChildBands.LastRow.Cells["columnA"].Value;
}

Note, this will not work if you edit the cells values. If you need to update the parent row value after cell update, again in InitializeRowEvent you can add this:

// look for row in the secon band
if (e.Row.Band.Index == 1)
{
    // get the last row in the second band
    if (e.Row == e.Row.ParentRow.ChildBands.LastRow)
    {
        // get the value of the last row in the second band and set it to the parent row
        e.Row.ParentRow.Cells["columnA"].Value = e.Row.Cells["columnA"].Value;
    }
}

CodePudding user response:

This will loop through ChildBands and set parent row value with the last value in each ChildBand.

var test = gridLayout.Rows.Count;
for (int i = 0; i < test; i  )
{
foreach (UltraGridChildBand childBand in baseGrid.Rows[i].ChildBands)
     {
      foreach (UltraGridRow row in childBand.Rows)
          {
           row.Cells["columnA"].Value =row.ChildBands.LastRow.Cells["columnA"].Value;
          }
     }
            
}
  • Related