Winform:指定DataGridView排序规则

本文介绍如何在Winform的DataGridView中实现自定义排序功能,通过设置SortMode为Programmatic,并监听ColumnHeaderMouseClick事件来实现升序和降序的排序逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Winform中的DataGridView,可通过鼠标单击列表头,按指定列的升序/降序排列数据,不过这种排列方式也有一定局限性。举例来说,若DataGridView内数据为后台传入的分页查询后得到的数据,单击列头也只能改变一页内的数据排列顺序,这样的排序就没有意义了。

因此,需要找到一个办法,在用鼠标单击列表头后,按我们自己制定的规则,重新生成DataGridView内的数据。方法如下:

新建一个窗体FormMain,上面放置了DataGridView控件,包含4列,名称分别为col0、col1、col2、col3

窗体的Load函数代码如下:

private void FormMain_Load(object sender, EventArgs e)
{
    this.dgvTest.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    DataGridViewCellStyle dgvCellStyle = new DataGridViewCellStyle();
    dgvCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    dgvTest.ColumnHeadersDefaultCellStyle = dgvCellStyle;
    foreach (DataGridViewColumn dgvc in dgvTest.Columns)
    {
        dgvc.SortMode = DataGridViewColumnSortMode.Programmatic; //重点在这个属性
        dgvc.DefaultCellStyle = dgvCellStyle;
    }
    this.dgvTest.DataSource = DataHelper.GetTableDefault(); //这里返回默认排序后的数据

}

上面的代码中,将所有列的SortMode都改成了Programmatic,设定为Programmatic的列,在鼠标点击列头后将适用于我们指定的排序规则。实际操作中,也可以根据实际情况,在DataGridView的列设置界面有针对性的设置指定几列的SortMode。

/// <summary>
/// 点击列表头触发此事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvTest_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    int index = e.ColumnIndex;

    //只有排序模式为Programmatic的列触发指定排序规则
    if (dgvTest.Columns[index].SortMode != DataGridViewColumnSortMode.Programmatic)
    {
        return;
    }

    switch (dgvTest.Columns[index].HeaderCell.SortGlyphDirection)
    {
        case SortOrder.None:
        case SortOrder.Ascending:
            //-----TODO----- 升序:在这里加入各列排序的逻辑 -----TODO-----
            switch (index)
            {
                case 0: dgvTest.DataSource = DataHelper.GetTableOrderBy0Asc(); break; //这里返回指定规则排序后的数据
                case 1: dgvTest.DataSource = DataHelper.GetTableOrderBy1Asc(); break;
                case 2: dgvTest.DataSource = DataHelper.GetTableOrderBy2Asc(); break;
                case 3: dgvTest.DataSource = DataHelper.GetTableOrderBy3Asc(); break;
                default: dgvTest.DataSource = DataHelper.GetTableDefault(); break;
            }
            //设置列标题右侧三角形状
            dgvTest.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Descending;
            break;
        case SortOrder.Descending:
            //-----TODO----- 降序:在这里加入各列排序的逻辑 -----TODO-----
            switch (index)
            {
                case 0: dgvTest.DataSource = DataHelper.GetTableOrderBy0Desc(); break; //这里返回指定规则排序后的数据
                case 1: dgvTest.DataSource = DataHelper.GetTableOrderBy1Desc(); break;
                case 2: dgvTest.DataSource = DataHelper.GetTableOrderBy2Desc(); break;
                case 3: dgvTest.DataSource = DataHelper.GetTableOrderBy3Desc(); break;
                default: dgvTest.DataSource = DataHelper.GetTableDefault(); break;
            }
            //设置列标题右侧三角形状
            dgvTest.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
            break;
    }
}

其中,DataHelper是一个数据生成类,在现实环境下,返回值为排序后的DataTable、数组等数据结构,直接放入DataGridView的DataSource中即可。

DEMO程序下载地址:https://pan.baidu.com/s/1jHNLkea

END

转载于:https://my.oschina.net/Tsybius2014/blog/892485

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值