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