C# 支持对象已删除状态的DTO的BindingList

C# 支持对象已删除状态的DTO的BindingList,c#,binding,dto,C#,Binding,Dto,我有一个DTO的BindingList,它可以直接绑定到窗口窗体控件,当用户想要删除我的datagridview中的一行时,就会出现这个问题 在这种情况下,删除的对象(行)会消失,当DTO BindingList返回服务器进行更新时,我不知道要删除哪一行 默认情况下,BindingList是否可以为已删除的对象创建集合,或者我必须手动实现它,或者在我的情况下还有其他选项 任何帮助都将不胜感激。BindingList有一个ListChanged事件,该事件在列表更改时引发。您需要编写代码来处理此事

我有一个DTO的BindingList,它可以直接绑定到窗口窗体控件,当用户想要删除我的datagridview中的一行时,就会出现这个问题

在这种情况下,删除的对象(行)会消失,当DTO BindingList返回服务器进行更新时,我不知道要删除哪一行

默认情况下,BindingList是否可以为已删除的对象创建集合,或者我必须手动实现它,或者在我的情况下还有其他选项


任何帮助都将不胜感激。

BindingList有一个ListChanged事件,该事件在列表更改时引发。您需要编写代码来处理此事件并跟踪列表中删除的项目


另一个选项是跟踪在DataGridView中发生的删除。

我认为,使用LinQ手动获取数据。 为结果创建一个数据表,如

DataTable dt = new DataTable();

        dt.Columns.Add("Want to Delete?",typeof(bool));
        dt.Columns.Add("Data Id", typeof(string));
        dt.Columns.Add("Data 1", typeof(string));
        dt.AcceptChanges();

        return dt;
然后为结果创建行,如

在foreach循环中(myResult中的var结果)

让用户可以选择要删除的行,用户可以检查第一列。因为它是bool(复选框) 在删除按钮单击事件之后,处理所选行

foreach (DataRow dr in yourDataTable.Rows)
        {
            if (Convert.ToBoolean(dr[0])) // goes in if its checked
            {
                // delete dr[0]
            }
        }

我希望这将对您有所帮助。

您好,Serkan,我需要在1次传输内将更改应用回数据库,您的解决方案可以很好地处理简单对象,但我很惊讶它不能处理更复杂的对象(具有子关系的对象…),子对象首先得到更新,当用户想要取消对主对象的编辑时,无法恢复已删除的子对象。谢谢。嗨,沃尔特,非常感谢你的快速回复。ListChanged事件在对象从列表中删除后激发,因此此时无法获取对已删除项的引用。我可以在BindingList中有一个列表,保留所有原始项并从中获取删除的项,但我认为这不是一个好主意。跟踪DataGridView中的删除对我来说不是一个选项,因为我构建了一个服务来为我的客户提供DTO对象,所以我无法控制客户端发生了什么。你对此还有什么想法吗?@TheMy-你的bindinglist是继承bindinglist(即MyObjectList:bindinglist)的自定义类还是MyObject的bindinglist?嗨,Walter,我的bindinglist是从bindinglist继承的自定义类,它充当我的自定义对象的bindinglist,下面是my class:public class DataList:BindingList的声明,其中T:DataTransferBaseHi Walter,我尝试重写BindingList的RemoveItem函数来实现对已删除项的跟踪,结果似乎没有问题,只是当用户删除datagridview中的最后一行时,datagridview会自动添加新行(空行)并删除该行,然后。。。做点别的。在这之后,我的BindingList在删除的项目列表中有两行,如果我将AllowUserToAddress设置为false,那么它就可以正常工作。当用户删除项目时,DataGridView的默认行为是什么?
foreach (DataRow dr in yourDataTable.Rows)
        {
            if (Convert.ToBoolean(dr[0])) // goes in if its checked
            {
                // delete dr[0]
            }
        }