我有一个要求,即新行和已删除行不应在DataGridView中可见。我一直能够隐藏已删除的行,虽然不是一种理想的方式。我无法正确地隐藏新行,同时仍然能够在包含更多信息的详细信息组框中更改绑定对象。这让我怀疑我正以完全错误的方式处理这个问题(另一个迹象是,我已经搜索了很多,但一直找不到任何与我的情况类似的东西)。
现行方法
我有一个DataGridView,它绑定到一个BindingSource。这个BindingSource的BindingSource当前是一个BindingList<T> (但我尝试了其他的BindingList<T>,比如DataTable和DataView,并且使用了IBindingListView的自定义实现)。此外,一组控件(TextBoxes、ComboBoxes等)绑定到当前的BindingSource对象(参见代码下面的示例屏幕快照)。绑定数据来自WCF服务,而不是数据库。
internal enum PersonState
{
// New rows that have not been "added" yet. Hide from UI.
New,
// New rows that have been "added". These should be saved to the server
Added,
// Altered rows. These should be updated on the server
Edited,
// Deleted rows. Hide from UI and delete from server when saving.
Deleted,
// Do nothing
Unchanged
}
public class Person : INotifyPropertyChanged
{
// the following properties have code to raise PropertyChanged
public string Name { get; set; }
public DateTime BirthDate { get; set; }
internal PersonState State { get; set; }
}
public void NewPersonButton_Click()
{
var person = new Person();
person.State = PersonState.New;
personList.Add( person );
}现在,从示例屏幕截图;如果用户单击“新建”,Person类的一个新实例将添加到支持BindingSource的BindingList<T>中。此时,他们希望将行隐藏在DataGridView中(状态为新建),但用户应该能够使用详细信息组框更改值。一旦用户满意(信息通过验证),用户可以单击"Add“。只有在这一步之后,他们才希望看到DataGridView中的行(状态更改为添加了)。
测试方法
我看不出有什么办法可以用直接的前向绑定来实现这一点。我想我要问的是,是否有人使用绑定实现了这样的目标?有人对其他方法有什么建议吗?
发布于 2017-08-21 01:00:28
您是否尝试过使用BindingSource来裁剪您不想要的行?
BindingSource bs = new BindingSource();
private void SetSource()
{
bs.DataSource = personList.Where(p=>p.State != PersonState.Deleted && p.State != PersonState.New);
grid.DataSource = bs;
}
public void NewPersonButton_Click()
{
var person = new Person();
person.State = PersonState.New;
personList.Add( person );
bs.ResetBindings(false);
}https://stackoverflow.com/questions/45546547
复制相似问题