如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?

Posted

技术标签:

【中文标题】如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?【英文标题】:How to bind List<DisplayedInfo> to datagridview with DataGridViewAutoFilter library? 【发布时间】:2020-11-03 16:04:02 【问题描述】:

我需要在我的 DataGridView 中添加过滤功能。我今天尝试使用 DataGridViewAutoFilter 库,但如果我使用 desinger 将列类型更改为DataGridViewAutoFilterTextBoxColumn,正如文档告诉我的那样,它不适用于我的 Winform 应用程序。在查看了 DataGridViewAutoFilter 示例之后,我认为数据源绑定存在一些问题。

我这样绑定我的数据源:

DisplayedInfo 是我用来存储信息的元数据对象。

我的绑定码是

Ilist<DisplayedInfo> infos = new List<DisplayedInfo>();
infos = GetAllInfosFromServer();
displayedInfoBindingSource = infos;

我认为我不能在这里使用类型List 作为我的数据源,因为DataGridViewAutoFilter 的文档表明BindingSource 组件必须绑定到IBindingListView

DataGridViewAutoFilter 绑定数据源示例工程如下:

关于newDataSet,它似乎是一个自定义组件,我不太明白它是如何工作的。在设计器上看起来像这样:

您可以在此处获取示例项目:sample download url。那么我应该如何修改我的代码以使其像示例一样工作。

我尝试将我的 List 转换为 IBindingListView 工具,例如 Equin.ApplicationFramework.BingdingListView,但仍然无法正常工作。

请帮忙!

这是我的转换代码:

public class AdvancedListHelper

    public static BindingListView<DisplayedInfo> ListToBindableList(IList<DisplayedInfo> infos)
    
        if (infos == null)
        
            return null;
        

        BindingListView<DisplayedInfo> advancedInfos = new BindingListView<DisplayedInfo>((List<DisplayedInfo>)infos);
           
        return advancedInfos;
    


我发现了一个关于DataGridViewAutoFilter 的问题。您不能在设计器中将 FilteringEnabled 更改为 true。我不知道为什么,但我将此代码添加到我的 Winform:

foreach (DataGridViewColumn col in columns)

    if (col is DataGridViewAutoFilter.DataGridViewAutoFilterTextBoxColumn)
    
        var c = col as DataGridViewAutoFilter.DataGridViewAutoFilterTextBoxColumn;
        var cell = c.HeaderCell;
        if (cell is DataGridViewAutoFilter.DataGridViewAutoFilterColumnHeaderCell)
        
            var ce = cell as DataGridViewAutoFilter.DataGridViewAutoFilterColumnHeaderCell;
            ce.FilteringEnabled = true;
        
    

现在我可以使过滤器按钮可见。但是当我点击按钮时,我得到一个未处理的异常:

System.NotSupportedException:无法从字符串表达式设置过滤器。

我认为这是Equin.ApplicationFramework.BingdingListView 的问题。所以现在我真的需要一个类来代替Equin.ApplicationFramework.BingdingListView。有什么想法吗?

【问题讨论】:

【参考方案1】:

一句话deferred execution

ListToBindableList 内或在其返回值上添加.ToList()

【讨论】:

这样吗?displayedInfoBindingSource.DataSource = AdvancedListHelper.ListToBindableList(source).ToList&lt;DisplayedInfo&gt;();.还是不行... @Xia,试试.ToList() 仍然没有过滤器...我认为数据源必须是IBindingListView 实现,而ToList() 无法满足该要求。

以上是关于如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?