首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DataGridView中隐藏符合特定条件的行

在DataGridView中隐藏符合特定条件的行
EN

Stack Overflow用户
提问于 2017-08-07 12:07:59
回答 1查看 986关注 0票数 1

我有一个要求,即新行和已删除行不应在DataGridView中可见。我一直能够隐藏已删除的行,虽然不是一种理想的方式。我无法正确地隐藏新行,同时仍然能够在包含更多信息的详细信息组框中更改绑定对象。这让我怀疑我正以完全错误的方式处理这个问题(另一个迹象是,我已经搜索了很多,但一直找不到任何与我的情况类似的东西)。

现行方法

我有一个DataGridView,它绑定到一个BindingSource。这个BindingSource的BindingSource当前是一个BindingList<T> (但我尝试了其他的BindingList<T>,比如DataTableDataView,并且使用了IBindingListView的自定义实现)。此外,一组控件(TextBoxes、ComboBoxes等)绑定到当前的BindingSource对象(参见代码下面的示例屏幕快照)。绑定数据来自WCF服务,而不是数据库。

代码语言:javascript
运行
复制
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类的一个新实例将添加到支持BindingSourceBindingList<T>中。此时,他们希望将行隐藏在DataGridView中(状态为新建),但用户应该能够使用详细信息组框更改值。一旦用户满意(信息通过验证),用户可以单击"Add“。只有在这一步之后,他们才希望看到DataGridView中的行(状态更改为添加了)。

测试方法

  1. 我已经测试了实现一个自定义IBindingListView,它将过滤底层集合(过滤任何状态等于新建或删除的Person对象)。但是,这似乎防止使用详细信息组框进行修改。我尝试了几种方法,例如https://blogs.msdn.microsoft.com/winformsue/2008/05/19/implementing-multi-column-filtering-on-the-ibindinglistview/
  2. 我已经测试了使用DataGridView.Rowsi.Visible = false隐藏行,并手动跟踪哪些行应该隐藏/可见。这与自定义IBindingListView具有相同的结果,因为无法将隐藏行设置为当前行。这样可以防止编辑详细信息组框中的信息。

我看不出有什么办法可以用直接的前向绑定来实现这一点。我想我要问的是,是否有人使用绑定实现了这样的目标?有人对其他方法有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-21 01:00:28

您是否尝试过使用BindingSource来裁剪您不想要的行?

代码语言:javascript
运行
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45546547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档