在 WinForms 中使用 BindingList 处理已删除标志<>
本文关键字:删除 标志 处理 BindingList WinForms | 更新日期: 2023-09-27 18:33:59
>我有一个带有前端的应用程序,而不是立即删除对象,而是在每个对象上都有一个标志,说明是否应该删除它,以便以后处理。所以问题是当我在WinForms中使用前端的对象与DataGrid时。当我设置已删除标志时,我希望对象不显示在数据网格中,绑定列表<>作为数据网格的数据源。有没有办法在每次重新绘制数据网格时强制使用过滤器?这会是数据网格的功能吗?还是绑定列表的函数<>?对于那些更直观的人,这里有一个代码示例。(警告 这是一个用于概念目的的代码示例)
测试.cs
public class Person : INotifyProperyChanged
{
public string Name { get; set; }
public int Id { get; set; }
private bool _isForDelete;
public bool IsForDelete
{
get { return _isForDelete; }
set
{
_isForDelete = value;
OnPropertyChanged("IsForDelete")
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的表单.cs
private BindingList<Person> _persons;
private void MyForm_Load(object sender, EventArgs e)
{
_persons = GetPersonsFromServer();
//Obviously this doesn't work, but I can dream. This is the basic idea.
_myDataGrid.DataSource = _persons.Where(x=>!x.IsForDelete);
}
private void DeleteBtn_Click(object sender, EventArgs e)
{
foreach(var row in _myDataGrid.SelectedRows)
{
var person = (Person)row.DataBoundItem;
person.IsForDelete = true;
}
}
有什么建议吗?
问题的一种解决方案是遍历 datagrid 的每一行,获取绑定到它的对象,检查属性,然后如果设置为 true 暂停绑定,则将行设置为不可见,然后恢复绑定。像这样:
CurrencyManager cur = (CurrencyManager)datagrid.BindingContext[datagrid.Datasource];
cur.SuspendBinding();
datagridviewrow.Visible = false;
cur.ResumeBinding();