【发布时间】:2010-06-30 09:01:34
【问题描述】:
我有一个用于 DTO 的 BindingList,它可以直接绑定到窗口窗体控件,当用户想要删除我的 datagridview 中的一行时出现了问题。
在这种情况下,已删除的对象(行)消失了,当 DTO BindingList 返回服务器进行更新时,我不知道要删除哪一行。
默认情况下,BindingList 是否可以包含已删除对象的集合,或者我必须手动实现它,或者对于我的情况还有其他选择?
任何帮助将不胜感激。
【问题讨论】:
我有一个用于 DTO 的 BindingList,它可以直接绑定到窗口窗体控件,当用户想要删除我的 datagridview 中的一行时出现了问题。
在这种情况下,已删除的对象(行)消失了,当 DTO BindingList 返回服务器进行更新时,我不知道要删除哪一行。
默认情况下,BindingList 是否可以包含已删除对象的集合,或者我必须手动实现它,或者对于我的情况还有其他选择?
任何帮助将不胜感激。
【问题讨论】:
BindingList 有一个 ListChanged 事件,该事件会在列表更改时引发。您需要编写代码来处理此事件并跟踪列表中的哪些项目被删除。
http://msdn.microsoft.com/en-us/library/ms132742.aspx
另一种选择是跟踪 DataGridView 中发生的删除。
【讨论】:
在我看来,使用 LinQ 手动获取数据。 为像
这样的结果创建一个 DataTableDataTable 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]
}
}
希望对你有帮助。
【讨论】: