在 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;
    }
}

有什么建议吗?

在 WinForms 中使用 BindingList 处理已删除标志<>

问题的一种解决方案是遍历 datagrid 的每一行,获取绑定到它的对象,检查属性,然后如果设置为 true 暂停绑定,则将行设置为不可见,然后恢复绑定。像这样:

CurrencyManager cur = (CurrencyManager)datagrid.BindingContext[datagrid.Datasource];
cur.SuspendBinding();
datagridviewrow.Visible = false;
cur.ResumeBinding();