Check Kinetic Check boxes with BPM Custom Code

I have a great classic dashboard that lists open order/releases for a specific customer. I have several checkboxes in the underlying UBAQ that let me decide which releases to close. Part of the BPM that does this keeps a count of releases it has closed in this way. This works great in classic and in the BAQ designer. However, in kinetic this isn’t working as expected. The underlying BPM custom code looks like this:

CloseCount=0;
DelCount=0;
UpdateCount=0;
RelCount=0;
ManualUp=0;
CloseOrder=false;
Message = "";
// step through each row of results and look at the check boxes the user choose
foreach (var xRow in (from ttResults_Row in queryResultDataset.Results where ttResults_Row.Calculated_CloseRelease == true || ttResults_Row.Calculated_UseDate == true ||  ttResults_Row.Calculated_Manual == true select ttResults_Row))
{
  //parse out order, line, rel from calculated field.
  MyOrder = System.Convert.ToInt32(xRow.OrderRel_OrderNum);
  MyLine = System.Convert.ToInt32(xRow.OrderRel_OrderLine);
  MyRel = System.Convert.ToInt32(xRow.Calculated_MinRel);
  //if Calculated_CloseRelease then close the open release
  // We really want to delete these releases as long as they have not been shipped on, and they do not have any jobs created on them, and they are the only release on a line.
  if (xRow.Calculated_CloseRelease == true)
  {
      using (Erp.Contracts.SalesOrderSvcContract soSvc = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.SalesOrderSvcContract>(Db))
    {   
      Erp.Tables.OrderRel OrderRel;
      var ORel = (from OrderRel_Row in Db.OrderRel
                 where OrderRel_Row.Company == Session.CompanyID && 
                       OrderRel_Row.OrderNum == MyOrder && 
                       OrderRel_Row.OrderLine == MyLine  
                 select OrderRel_Row); //Get the OrderRel record to update...
      if (ORel != null)
      {
        RelCount = ORel.Count();
      }
     if ((xRow.Calculated_Shipped >= 1) || (xRow.Calculated_MinJob != string.Empty || RelCount == 1)) //cant delete release, so close it
     {
       using (var txscope1 = IceDataContext.CreateDefaultTransactionScope())
      {
      foreach (var rels in (from rRow in Db.OrderRel where rRow.OrderNum == MyOrder && rRow.OrderLine == MyLine && rRow.OrderRelNum == MyRel select rRow))
       {
        if (rels != null)
        {
         rels.Character01 = BpmFunc.Now() + " System closed release " +  MyRel + " in order " + MyOrder + " on line " +  MyLine + ". " + " Shipped: " + xRow.Calculated_Shipped + " FirstJob: " + xRow.Calculated_MinJob;
         Db.Validate(rels);
         txscope1.Complete();
        }
       }
      }
       soSvc.CloseRelease(MyOrder, MyLine, MyRel);
       soSvc.Update(ref MyVar1);
       CloseCount = CloseCount + 1;
       Message = Message + MyOrder +MyLine + MyRel;
     }
     else // not closing release, so delete it
     {
     //using (Erp.Contracts.SalesOrderSvcContract soSvc =  Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.SalesOrderSvcContract>(Db))
      {
      SalesOrderTableset SOTS = soSvc.GetByID(MyOrder);  
      var desiredReleases = SOTS.OrderRel.Where(r => r.OrderLine == MyLine && r.OrderRelNum == MyRel); 
      foreach(var rel in desiredReleases)
      {
        rel.RowMod = "D";
        DelCount = DelCount + 1;
      }
      soSvc.Update(ref SOTS);
      var openRels = SOTS.OrderRel.Where(r => r.OpenRelease == true); 
      if (openRels.Count() == 0) 
      {
        soSvc.CloseOrderLine(MyOrder, MyLine);
        soSvc.Update(ref SOTS);
      }
      var openLines = SOTS.OrderDtl.Where(r => r.OpenLine == true); 
      if (openLines.Count() == 0) 
      {
        soSvc.CloseOrder(MyOrder);
        soSvc.Update(ref SOTS);
           CloseOrder=true; // this flag allows the memo to be created in the next widgets.
      }
      }
     }
     xRow.Calculated_CloseRelease = false;
    } 
  }
  //if Calcualted_UseDate then change our date to cust  date
  if (xRow.Calculated_UseDate == true)
  {
    // check to see if there is a valid date to update to - if not warn the user and uncheck usedate
    if (xRow.Calculated_MinDate == null)
    {
    PublishInfoMessage("There is no date for order " + MyOrder + " on line " +  MyLine + " release " + MyRel +  ". Check your selection.", Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual,"","");
    xRow.Calculated_UseDate = false;
    }
    else
    {
    MyOrder = xRow.OrderRel_OrderNum;
    MyLine = xRow.OrderRel_OrderLine;
    MyRel = xRow.Calculated_MinRel;
    MyDate = xRow.Calculated_MinDate;
    Erp.Tables.OrderRel OrderRel;
    using (var txscope1 = IceDataContext.CreateDefaultTransactionScope())
    {
     foreach (var rel in (from rRow in Db.OrderRel where rRow.OrderNum == MyOrder && rRow.OrderLine == MyLine && rRow.OrderRelNum == MyRel select rRow))
     {
      if (rel != null)
      {
        string DateNew = String.Format("{0:M/d/yyyy}", MyDate);
        string DateOld = String.Format("{0:M/d/yyyy}", rel.ReqDate);
        rel.Character01 =  BpmFunc.Now() + "--- System updated release " +  MyRel + " in order " + MyOrder + " on line " +  MyLine + "." + " Old Date: " + DateOld + " New Date: " + DateNew;
        rel.ReqDate = MyDate;
        rel.NeedByDate = MyDate;
        Db.Validate(rel);
        UpdateCount = UpdateCount + 1;
      }
      txscope1.Complete();
      }
    }
    xRow.Calculated_UseDate = false;
    }
  }
  
// all that is left are the manual edits
// For each manual edit, just apply the updated values
if (xRow.Calculated_Manual == true)
  {
     using (Erp.Contracts.SalesOrderSvcContract soSvc =  Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.SalesOrderSvcContract>(Db))
      {
      SalesOrderTableset SOTS = soSvc.GetByID(MyOrder);  
      var desiredReleases = SOTS.OrderRel.Where(r => r.OrderLine == MyLine && r.OrderRelNum == MyRel); 
      MyDate = xRow.OrderRel_ReqDate;
      foreach(var rel in desiredReleases)
      {
        string DateNew = String.Format("{0:M/d/yyyy}", MyDate);
        string DateOld = String.Format("{0:M/d/yyyy}", rel.ReqDate);
        rel["Character01"] =  BpmFunc.Now() + "--- System manually updated release " +  MyRel + " in order " + MyOrder + " on line " +  MyLine + " Old Date: " + DateOld + " New Date: " + DateNew + " Old Qty: " + Convert.ToInt32(rel.OurReqQty) + " New Qty: " + xRow.OrderRel_OurReqQty;
        rel.ReqDate = MyDate;
        rel.NeedByDate = MyDate;
        rel.OurReqQty = xRow.OrderRel_OurReqQty;
        rel.Make = true;
        rel.RowMod = "U";
        ManualUp=ManualUp+1;
      }
      soSvc.Update(ref SOTS);
      }
  }
}

The field CloseCount seems to be looping once more than it should, only in Kinetic. As a result when I click a box to close one release, the close count returns 2. I think this is because I use the checkbox to decide if we are done processing rows. In classic, I would uncheck the checkbox that the user clicked once the row has been processed. I would do this with:

xRow.Calculated_CloseRelease = false;

My guess is that the kinetic form need some different code or another update somewhere to tell it to uncheck that box. Has anyone else experienced something similar with Kinetic? Do you have any ideas why this loop might be happening twice for orders I want to close?
Thanks for your time!
Nate