如何使用 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<DisplayedInfo>();
.还是不行...
@Xia,试试.ToList()
仍然没有过滤器...我认为数据源必须是IBindingListView
实现,而ToList()
无法满足该要求。以上是关于如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?