本文介绍了WinForms:DataGridView - 程序化排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有 datagridview 的表单.dataGridView 绑定到 BindingSource:

I've got a form with datagridview on it. dataGridView is binded to BindingSource:

public class Address
{
    public string State { get; set; }
    public string City { get; set; }
    public string Street { get; set; }
}
this.addressBindingSource.DataSource = typeof(Address);
this.dataGridView1.DataSource = this.addressBindingSource;

我像这样填充DataSource:

    addressBindingSource.DataSource = new BindingList<Address>
    {
        new Address {State = "S1", City = "C1", Street = "S1"},
        new Address {State = "S1", City = "C1", Street = "S2"},
        new Address {State = "S1", City = "C1", Street = "S3"},
        new Address {State = "S1", City = "C2", Street = "S4"},
        new Address {State = "S1", City = "C2", Street = "S5"},
        new Address {State = "S1", City = "C2", Street = "S6"},
    };

我正在尝试为此 datagridview 启用排序.我将 dataGridView1 的所有列的 SortMode 设置为 Programmatic.我为 ColumnHeaderMouseClick 添加了一个事件处理程序:

I'm trying to enable sorting for this datagridview. I set SortMode to Programmatic for all the columns of dataGridView1. And I added an event handler for ColumnHeaderMouseClick:

    private Dictionary<int, string> columnIndexPropertyNameDictionary = new Dictionary<int, string>
        {
            {0, "State"},
            {1, "City"},
            {2, "Street"},
        };

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex < 0)
        return;

    for (int i = 0; i < dataGridView1.Columns.Count; i++)
    {
        if (i == e.ColumnIndex)
            continue;
        dataGridView1.Columns[i].HeaderCell.SortGlyphDirection = SortOrder.None;
    }

    var column = dataGridView1.Columns[e.ColumnIndex];

    if (column.SortMode != DataGridViewColumnSortMode.Programmatic)
        return;

    var sortGlyphDirection = column.HeaderCell.SortGlyphDirection;

    switch (sortGlyphDirection)
    {
        case SortOrder.None:
        case SortOrder.Ascending:
            addressBindingSource.Sort = columnIndexPropertyNameDictionary[e.ColumnIndex] + " ASC";
            column.HeaderCell.SortGlyphDirection = SortOrder.Descending;
            break;
        case SortOrder.Descending:
            addressBindingSource.Sort = columnIndexPropertyNameDictionary[e.ColumnIndex] + " DESC";
            column.HeaderCell.SortGlyphDirection = SortOrder.Ascending;
            break;
    }
}

排序仍然不起作用.我做错了什么?

Sorting still doesn't work. What am I doing wrong?

推荐答案

问题是开箱即用的 BindingList 不支持排序!我知道 - 听起来很愚蠢,但事实就是如此.

The problem is that out of the box the BindingList does not support sorting! I know - sounds dumb but that is how it is.

您需要实现自己的 SortableBindingList.代码示例如下.

You need to implement your own SortableBindingList. An example of the code for that is below.

此代码来自这里 我没有时间彻底检查它.如果它不起作用,那么谷歌搜索术语 SortableBindingList,那里有很多的实现.

This code came from here and I don't have time to check it thoroughly. If it doesn't work then google the term SortableBindingList, there are lots of implementations out there.

public class SortableBindingList<t> : BindingList<t>
{
    private bool m_Sorted = false;
    private ListSortDirection m_SortDirection = ListSortDirection.Ascending;
    private PropertyDescriptor m_SortProperty = null;

    protected override bool SupportsSortingCore
    {
        get
        {
            return true;
        }
    }

    protected override bool IsSortedCore
    {
        get
        {
            return m_Sorted;
        }
    }

    protected override ListSortDirection SortDirectionCore
    {
        get
        {
            return m_SortDirection;
        }
    }

    protected override PropertyDescriptor SortPropertyCore
    {
        get
        {
            return m_SortProperty;
        }
    }

    protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
    {
        m_SortDirection = direction;
        m_SortProperty = prop;
        var listRef = this.Items as List<t>;
        if (listRef == null)
            return;
        var comparer = new SortComparer<t>(prop, direction);

        listRef.Sort(comparer);

        OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
   }
}

这篇关于WinForms:DataGridView - 程序化排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-29 17:41