【问题标题】:BindingList for DTO which support object deleted state支持对象已删除状态的 DTO 的 BindingList
【发布时间】:2010-06-30 09:01:34
【问题描述】:

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

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

默认情况下,BindingList 是否可以包含已删除对象的集合,或者我必须手动实现它,或者对于我的情况还有其他选择?

任何帮助将不胜感激。

【问题讨论】:

    标签: c# binding dto


    【解决方案1】:

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

    http://msdn.microsoft.com/en-us/library/ms132742.aspx

    另一种选择是跟踪 DataGridView 中发生的删除。

    【讨论】:

    • 您好 Walter,非常感谢您的快速回复。从列表中删除对象后触发的 ListChanged 事件,因此此时我无法获得对已删除项目的引用。我可以在我的 BindingList 中有一个列表,它保留所有原始项目并从那里获取已删除的项目,但我认为这不是一个好主意。跟踪 DataGridView 中的删除对我来说不是一个选项,因为我构建了一个服务来为我的客户提供 DTO 对象,所以我无法控制客户端发生的事情。你对此有什么其他想法吗?
    • @TheMy - 您的 bindinglist 是继承 BindingList 的自定义类(即 MyObjectList:BindingList)还是 MyObject 的 BindingList?
    • 嗨 Walter,我的 BindList 是一个从 BindingList 继承的自定义类,它充当我的自定义对象的 BindingList,下面是我的类的声明: public class DataList : BindingList 其中 T : DataTransferBase
    • 嗨 Walter,我尝试重写 BindingList 的 RemoveItem 函数来实现对已删除项目的跟踪,这似乎没问题,除了当用户删除 datagridview 中的最后一行时,datagridview 会自动添加新的行(空白行)并删除该行并...做其他事情。之后,我的 BindingList 最终在已删除项目列表中有 2 行,如果我将 AllowUserToAddRows 设置为 false,那么它可以完美运行。用户删除项目时 DataGridView 的默认行为是什么?
    【解决方案2】:

    在我看来,使用 LinQ 手动获取数据。 为像

    这样的结果创建一个 DataTable
    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(var result in myResult)

    object[] row = new object[]
            {
            false,
            result.Id,
            result.Data1
            };
            dt.Rows.Add(row);
    

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

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

    希望对你有帮助。

    【讨论】:

    • 嗨 Serkan,我需要在 1 次传输中将更改应用回数据库,您的解决方案适用于简单的对象,但我担心它不能适用于更复杂的对象(有孩子的对象关系...),子对象首先得到更新,当用户想要取消对主对象的编辑时,被删除的子对象无法恢复。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2010-12-04
    • 2019-10-27
    • 2013-06-02
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多