C# 使用BindingList处理已删除的标志<&燃气轮机;以WinForms

C# 使用BindingList处理已删除的标志<&燃气轮机;以WinForms,c#,winforms,datagrid,bindinglist,C#,Winforms,Datagrid,Bindinglist,我有一个带有前端的应用程序,我们没有立即删除对象,而是在每个对象上都有一个标志,表明是否应该删除它,以便以后可以处理它。所以问题是当我在WinForms中使用前端对象和数据网格时。当我设置Deleted标志时,我希望对象不会显示在DataGrid中,BindingList是DataGrid的数据源。是否有办法在每次重新绘制DataGrid时强制筛选?这是DataGrid的一个功能吗?还是BindingList的函数?对于那些更直观的人,这里有一个代码示例。(警告:出于概念目的,这是一个代码示例)

我有一个带有前端的应用程序,我们没有立即删除对象,而是在每个对象上都有一个标志,表明是否应该删除它,以便以后可以处理它。所以问题是当我在WinForms中使用前端对象和数据网格时。当我设置Deleted标志时,我希望对象不会显示在DataGrid中,BindingList是DataGrid的数据源。是否有办法在每次重新绘制DataGrid时强制筛选?这是DataGrid的一个功能吗?还是BindingList的函数?对于那些更直观的人,这里有一个代码示例。(警告:出于概念目的,这是一个代码示例)

test.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));
        }
     }
}
MyForm.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;
    }
}
private bindingslist\u个人;
私有void MyForm_加载(对象发送方,事件参数e)
{
_persons=GetPersonsFromServer();
//显然这不起作用,但我可以做梦。这是基本的想法。
_myDataGrid.DataSource=_persons.Where(x=>!x.IsForDelete);
}
私有void DeleteBtn_单击(对象发送方,事件参数e)
{
foreach(变量行在_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();