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