Winform:指定DataGridView排序规则

原创
2017/05/04 18:07
阅读数 1.7K

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

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
0 收藏
0
分享
返回顶部
顶部