Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用SortableBindingList<T> - DataGridView不会自动对更改进行排序

使用SortableBindingList<T> - DataGridView不会自动对更改进行排序
EN

Stack Overflow用户
提问于 2016-09-16 17:38:18
回答 1查看 2K关注 0票数 3

我正在构建一个Windows Forms应用程序,它显示一个自定义类Record对象,并根据它们在我的SortableBindingList<Record> record_list中存在的时间对它们进行排序。当我启动我的程序时,出于测试的目的,我已经将一些“虚拟”记录加载到这个列表中。

SortableBindingList<T>是从here中提取的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class Form1 : Form
{
    public SortableBindingList<Record> record_list = new SortableBindingList<Record> { };
    public static DataGridViewCellStyle style = new DataGridViewCellStyle();
    public Form1()
    {
        InitializeComponent();
        dataGridView.DataSource = record_list;
        FillData(); //Temporary function to insert dummy data for demo.
        dataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.cell_formatting);
        this.Controls.Add(dataGridView);
        this.dataGridView.RowHeadersVisible = false;
        this.dataGridView.Sort(this.dataGridView.Columns["UserName"], ListSortDirection.Ascending);

        start_timer();                 
    }

在添加"new“数据之前的结果(注意:这是自动字母排序的,特别是按字母顺序输入列表):

添加数据后的结果:

最后,单击"UserName“标题后的结果:

那么,我必须在每次更新我的DataSource时强制排序吗?如果是这样的话,我如何以这种方式调用排序呢?

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 19:58:06

当列表发生变化时,您需要应用排序。

当在列表中做了一些更改时,SortableBindingList需要进行一些更改以保持列表的排序。这是我所做的修改后的完整代码。

注意,BindingListOnListChanged方法会在添加和删除项后自动调用。但是,如果您需要在更改项的属性后也运行OnListChanged,则应该为您的模型类实现INotifyPropertyChanged

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
public class SortableBindingList<T> : BindingList<T>
{
    private bool isSortedValue;
    ListSortDirection sortDirectionValue;
    PropertyDescriptor sortPropertyValue;
    public SortableBindingList() : base() { }
    public SortableBindingList(IList<T> list) : base(list) { }
    protected override void ApplySortCore(PropertyDescriptor prop,
        ListSortDirection direction)
    {
        Type interfaceType = prop.PropertyType.GetInterface("IComparable");
        if (interfaceType == null && prop.PropertyType.IsValueType)
        {
            Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);
            if (underlyingType != null)
            {
                interfaceType = underlyingType.GetInterface("IComparable");
            }
        }
        if (interfaceType != null)
        {
            sortPropertyValue = prop;
            sortDirectionValue = direction;
            IEnumerable<T> query = base.Items;
            if (direction == ListSortDirection.Ascending)
                query = query.OrderBy(i => prop.GetValue(i));
            else
                query = query.OrderByDescending(i => prop.GetValue(i));
            int newIndex = 0;
            foreach (object item in query)
            {
                this.Items[newIndex] = (T)item;
                newIndex++;
            }
            isSortedValue = true;
            sorting = true;
            this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
            sorting = false;
        }
        else
        {
            throw new NotSupportedException("Cannot sort by " + prop.Name +
                ". This" + prop.PropertyType.ToString() +
                " does not implement IComparable");
        }
    }
    bool sorting = false;
    protected override PropertyDescriptor SortPropertyCore
    {
        get { return sortPropertyValue; }
    }
    protected override ListSortDirection SortDirectionCore
    {
        get { return sortDirectionValue; }
    }
    protected override bool SupportsSortingCore
    {
        get { return true; }
    }
    protected override bool IsSortedCore
    {
        get { return isSortedValue; }
    }
    protected override void RemoveSortCore()
    {
        isSortedValue = false;
        sortPropertyValue = null;
    }
    protected override void OnListChanged(ListChangedEventArgs e)
    {
        if (!sorting && sortPropertyValue != null)
            ApplySortCore(sortPropertyValue, sortDirectionValue);
        else
            base.OnListChanged(e);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39537273

复制
相关文章
[一起学RL] 策略迭代和值迭代
上一次分享了十个问题认识MDP,强化学习的目的是要找到一个策略π,使得累积回报的期望最大。这次和大家分享如何在MDP下做决策以及如何得到各个状态对应不同动作下的v值。如果想详细学习的可前往“参考”中的链接。
秋枫学习笔记
2022/09/19
1.6K0
Python字典提取_python字典键对应的值
注意如果存在相同键值,比如说: a={'a':1,'b':2,'c':3,'aa':12} b= {'aa':11,'bb':22,'cc':33} 那么方法一\二\三得到结果为
全栈程序员站长
2022/11/03
3.7K0
Python - 字典中的值求和
Python 编程语言是一种高级的通用编程语言,广泛用于各种目的。该软件由网页设计、数据分析和人工智能组成。人们之所以意识到这一点,是因为它的简单性、易读性和可用性的便利性。Python 提供了各种预定义的数据结构,包括列表、元组、映射、集合、堆和阵容。这些组件在每种编程语言中都至关重要。在这篇文章中,我们将专注于用于保存关键信息对的词典。
很酷的站长
2023/08/11
3160
Python - 字典中的值求和
【Python】字典 dict ① ( 字典定义 | 根据键获取字典中的值 | 定义嵌套字典 )
字典 在 大括号 {} 中定义 , 键 和 值 之间使用 冒号 : 标识 , 键值对 之间 使用逗号 , 隔开 ;
韩曙亮
2023/10/11
2880
22.Python对列表与字典的迭代
在Python中只要是可迭代对象,都可以通过for循环进行遍历。列表与字典都是可迭代对象,所以都可以通过for进行遍历。 1.列表的遍历
用户4381798
2020/07/30
1.9K0
Python获取字典值
前面简单介绍了Python字典,以及如何创建字典。今天我们来聊聊如何获取字典中的值。python中有两种方法来获取字典中的值——get() 方法和 [key] 方法,今天我们来简单对比一下这两种方法。我们还是拿上次的car来举例子。
生信交流平台
2020/08/06
1.9K0
python字典更新值_Python–字典元组值更新
有时在处理元组数据时,我们在执行其版本时会遇到问题,原因是它是不可变的。讨论字典中元组值的版本。这在许多领域都有应用,因为字典通常是web开发和数据科学领域中流行的数据类型。让我们讨论解决这个问题的某
用户7886150
2021/01/13
2.4K0
python 字典最大值、最小值、排序
prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 }
用户5760343
2019/09/25
1.7K0
抛弃dict[key]的方式访问Python字典的值
如果key不存在,dkey会抛出一个KeyError类型的异常,这将导致python程序崩溃,这是非常令人烦恼的事情。
AIFEx
2023/10/04
2480
抛弃dict[key]的方式访问Python字典的值
Flask 学习-89.模板中迭代字典.items()
django 中迭代字典,可以直接Dict.items,在flask 中迭代字典遇到了一些坑
上海-悠悠
2023/01/03
6230
Flask 学习-89.模板中迭代字典.items()
二值图拓扑性质 —— 迭代修正
除了将二值图中的局部处理结果直接加起来以外,我们还可以用这些局部处理结果来生成一张新的二值图。根据原图中的对应图像单元的局部计算结果,我们可以确定:新的二值图中相应图像单元的值。新的二值图可以被作为:另一个计算周期的输入。这个操作被称为:迭代修正。
为为为什么
2022/08/09
5950
二值图拓扑性质 —— 迭代修正
Python使用对象方式获取字典的值
2020-07-23 发表在 编程语言 35 字典获取值方式: aa=dict() aa.get('aa') 如果想改成对象获取方式,可以用下列代码: # 定义一个类 class DictToObject(object): def __init__(self, d): self.__dict__.update(d) if __name__ == '__main__': d = {'id': 79, 'xc': 'B01AWLPUAG', 'crea
小贝壳
2020/07/26
4.2K0
RL实践1——动态规划值迭代
动态规划的使用条件时MDP已知,在简单游戏中,这个条件时显然成立的 使用Value iteration的方法求解每个状态的价值函数,迭代收敛之后,对应最优策略生成。
列夫托尔斯昊
2020/09/07
5090
字典值替换注解 – AOP最佳实践
收心
2023/06/07
5390
查询字典码,并且以值的形式进行返回
在加入到数据库的时候,对应的字段是代码编号,但是查询的时候,我们要展示,不能只是展示编号,要展示的是编号对应的具体的值,所以,我们需要在xml里面进行套语句。也就是在查询语句里面套
一写代码就开心
2020/11/20
1.5K0
示例讲字典(Dictionary):获取唯一值
字典(Dictionary)是一种通过键(key)和项(item)(注:键和项是字典中的术语)存储唯一项的方法。它是一种基于唯一键存储数据的极好工具,它的强大之处在于可以使用键来存储和合并数据。
fanjy
2022/11/16
4.9K0
示例讲字典(Dictionary):获取唯一值
Python如何修改字典键所对应值
字典中有成对出现的键和值,但是字典中的键值对不是都能修改的,只有值才能修改,我们可以把字典中的键理解为列表下标,一个列表的下标永远是从0开始依次递增1的,是无法修改的。
python自学网
2021/12/02
4.9K0
Python如何修改字典键所对应值
python函数——字典设置默认值 setdefault()
Python 字典 setdefault() 函数是添加键并将值设为默认值。 当然,Python 字典中 get() 也可以实现字典默认值的操作,相关博文如下 python函数——字典设置默认值 get() python函数——字典设置get() 与 setdefault()区别
莫斯
2020/09/10
1.9K0
【说站】python使用get()访问字典值
1、一般访问字典中的键值作为索引引用值,但会出现问题。如果访问的键值不在字典中,就会出错。
很酷的站长
2022/11/24
7820
【说站】python使用get()访问字典值
点击加载更多

相似问题

“$”符号在Powershell中有什么作用?

221

"@“符号在SQL中有什么作用?

73

“&”符号在SQL中有什么作用?

20

$符号在VBA中有什么作用?

4108

"@“符号在PowerShell中有什么作用?

52
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文