一、字段标识说明
单据体标识:FEntity
序号标识:Seq
物料标识:F_XXXX_MaterialId
【一键删除】操作标识:CleanEmptyEntity
二、表单插件
三、获取单据体数据包
//获取单据体,为空提示操作失败 var entityD = this.View.Model.DataObject["FEntity"] as DynamicObjectCollection; if (entityD==null || entityD.Count<=0) { e.Cancel = true; base.View.ShowErrMessage("明细信息为空,无需操作。"); break; } //不为空时,将物料为空的行全部删除,如果没有为空的行,那就提示操作失败 var canEntity = entityD.Where(s=>(s["F_XXXX_MaterialId_Id"]+"").Equals("0")).ToList(); if (canEntity == null || canEntity.Count <= 0) { e.Cancel = true; base.View.ShowErrMessage("明细信息全部有效,无需操作。"); break; }
四、移除物料为空的行
//循环删除分录1 测试通过 for (int i = entityD.Count - 1; i >= 0; i--) { string seq = Convert.ToString(entityD[i]["Seq"]); var getIsDelete = canEntity.Where(s => (s["Seq"] + "").Equals(seq)).ToList().FirstOrDefault(); if (getIsDelete != null) { entityD.RemoveAt(i); } }
其他方式,但是测试不通过,不建议使用
//循环删除分录2 测试不通过 每删除一行,集合就少一行,然而循环的索引是递增的,所以就会有需要删除的行往前挪了,错过了判断删除的时机 //for (int i = 0; i <= entityD.Count - 1; i++) //{ // string seq = Convert.ToString(entityD[i]["Seq"]); // var getIsDelete = canEntity.Where(s => (s["Seq"] + "").Equals(seq)).ToList().FirstOrDefault(); // if (getIsDelete != null) // { // entityD.RemoveAt(i); // } //} //循环删除分录3 测试不通过 不影响原来的实体 //for (int i = canEntity.Count - 1; i >= 0; i--) //{ // canEntity.RemoveAt(i); //} //循环删除分录4 测试不通过 删除第一条后,下一次循环获取报错:集合已修改;可能无法执行枚举操作。 //foreach (var item in entityD) //{ // //直接判断 物料编码为空,则直接删除 // if ((item["F_XXXX_MaterialId_Id"] + "").Equals("0")) // { // entityD.Remove(item); // } //} //循环删除分录5 测试不通过,无反应 //entityD.ToList().RemoveAll(s => (s["F_XXXX_MaterialId_Id"] + "").Equals("0")); //entityD.ToList().RemoveAll(canEntity); //entityD.ToList().RemoveAll(s => canEntity.Select(d => (d["F_XXXX_MaterialId_Id"] + "")).ToList().Contains((s["F_XXXX_MaterialId_Id"] + ""))); //entityD.ToList().RemoveAll(s => "0".Contains(s["F_XXXX_MaterialId_Id"] + ""));
//循环删除分录4 测试不通过 删除第一条后,下一次循环获取报错:集合已修改;可能无法执行枚举操作。 foreach (var item in entityD) { //直接判断 物料编码为空,则直接删除 if ((item["F_XXXX_MaterialId_Id"] + "").Equals("0")) { entityD.Remove(item); } }
五、序号重新生成
//获取已经生成的行的最大序号,新的行按照这个继续递增 int maxSeq = entityD.Where(s => Convert.ToInt64(s["Id"]) > 0).Max(d => Convert.ToInt32(d["Seq"])); //需要 序号重新编号 var sortSeqE = entityD.Where(s => Convert.ToInt64(s["Id"]) == 0).ToList(); for (int i=0;i< sortSeqE.Count();i++) { sortSeqE[i]["Seq"] = ++maxSeq; } this.View.UpdateView("FEntity");//刷新单据体
六、测试
标签:ToList,插件,XXXX,删除,自增,MaterialId,表单,entityD,Id From: https://www.cnblogs.com/lanrenka/p/17869652.html