【问题标题】:DataGridView automatic sorting doesn't work when datasource bound数据源绑定时DataGridView自动排序不起作用
【发布时间】:2013-03-04 14:31:09
【问题描述】:

我的问题是: 当我将数据源绑定到 DataGridView 时

BindingList<Contract> contracts = new BindingList<Contract>(Contract.GetAll());
dgEndingContracts.DataSource = contracts.Where(c => c.ExpirationDate <= nextMonth && c.IsArchived == false).ToList();

并将每一列设置为SortMode = DataGridViewColumnSortMode.Automatic 当我点击 dataGridView 标题行时没有排序。

但是当我手动创建每一列时,为dataGridView的每一行创建并填充数据,并将列排序模式设置为自动,排序工作正常。

有什么区别?如何在第一种方法中启用排序?

【问题讨论】:

  • 列是否设置为在网格中自动创建?这是我唯一能想到的..我相信它是 AuoGenerate Columns 属性..
  • 将 AutoGenerateColumns 设置为 false 并手动添加列也无济于事。由于性能问题,我想避免在 DataGridView 中手动创建列和行。
  • 如果您手动创建列,那么在我看来,您需要在代码中手动创建它们以及使用 new 关键字来创建列(如果我正在关注您的话)在你原来的问题中说

标签: c# .net winforms datagridview


【解决方案1】:

我找到了解决办法。

DataGridView 似乎无法排序List &lt;T&gt;BindingList&lt;T&gt;

所以我在code from 的基础上添加了class SortedBindingList&lt;T&gt;: 现在我的DataGridView 可以对列进行排序了。

感谢大家的帮助。

【讨论】:

    【解决方案2】:

    .ToList() 不返回实现 IBindingList 的内容。 使用一些东西,比如那个:

    dgEndingContracts.DataSource = new BindingList<Contract>(contracts.Where(c => c.ExpirationDate <= nextMonth && c.IsArchived == false).ToList());
    

    【讨论】:

    • 效果是一样的。单击列标题不会对其进行排序。
    • 是的,BindingList 默认不支持排序。这是如何使其可排序的示例:link 请参阅那里的 SortableBindingListCollection 实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2019-03-14
    相关资源
    最近更新 更多