Blazor DragAndDrop组件改造:实现拖拽复制,保留源列表项
解决方案:将Blazor拖拽组件改为复制模式
要实现拖拽时复制列表项而非移动,核心是修改对象更新逻辑,从修改原对象状态改为创建新对象副本并添加到目标集合。以下是具体修改步骤:
1. 为Groupdate类添加克隆方法
首先需要实现Groupdate对象的复制能力,避免直接修改原实例。在你的Groupdate实体类中添加克隆方法:
public class Groupdate { public int GrID { get; set; } public string Name { get; set; } // 请根据实际属性调整 public GroupsStatuses Status { get; set; } public DateTime LastUpdated { get; set; } // 克隆方法:复制所有属性 public Groupdate Clone() { return new Groupdate { // 注意:若GrID是主键,需生成新的唯一值(如自增ID或GUID) // 业务允许重复标识的话,可直接保留原值 GrID = this.GrID, Name = this.Name, Status = this.Status, LastUpdated = this.LastUpdated }; } }
2. 修改DragAndDropContainer.razor.cs的UpdateGroupsAsync方法
原方法通过修改原对象Status实现移动,现在改为创建副本并添加到集合:
public async Task UpdateGroupsAsync(GroupsStatuses newStatus) { // 克隆原拖拽对象 var newGroup = Payload.Clone(); // 设置副本的新状态和更新时间 newGroup.Status = newStatus; newGroup.LastUpdated = DateTime.Now; // 若GrID是主键,生成新的唯一ID(示例为int自增,根据实际类型调整) // if (Groups.Any()) // { // newGroup.GrID = Groups.Max(g => g.GrID) + 1; // } // else // { // newGroup.GrID = 1; // } // 将副本添加到总集合 Groups.Add(newGroup); // 触发状态更新回调 await OnStatusUpdated.InvokeAsync(newGroup); }
3. 效果验证
修改完成后:
- 拖拽
Exist状态的项到Assign区域时,原项会保留在Exist列表中 - 目标
Assign列表会新增一个与原项属性一致的副本 - 若配置了主键生成逻辑,副本会拥有独立的唯一标识(根据业务需求调整)
关键说明
- 克隆对象是核心:避免直接修改原对象的
Status,确保源列表不会因状态变化移除原项 - 主键处理:如果
GrID是数据库主键,必须生成新的唯一值,否则会引发数据冲突;业务允许重复标识的话可跳过此步骤
内容的提问来源于stack exchange,提问作者Lesika
相关产品推荐
相关产品推荐

