需求:将字符串排序改为数字排序
第一种方法是在声明gridview列时就将该列设为int类型,但我从后台接口get的数据就是string,所以需要重写这个方法,代码如下:
首先在设计界面把该列的SortMode设为grammeratic,这样才可以在代码中编辑此方法;
给这个表格列点击赋事件:
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
int index = e.ColumnIndex;
//只有排序模式为Programmatic的列触发指定排序规则
if (dataGridView1.Columns[index].SortMode != DataGridViewColumnSortMode.Programmatic)
{
return;
}
switch (dataGridView1.Columns[index].HeaderCell.SortGlyphDirection)
{
case SortOrder.None:
case SortOrder.Ascending:
//-----TODO----- 升序:在这里加入各列排序的逻辑
OrderData(BigTable, dataGridView1, "desc");
//设置列标题右侧三角形状
dataGridView1.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
case SortOrder.Descending:
//-----TODO----- 降序:在这里加入各列排序的逻辑
OrderData(BigTable, dataGridView1, "asc");
//设置列标题右侧三角形状
dataGridView1.Columns[index].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
}
}
里面的OrderData是新写的排序算法,因为我这里目前只需要重写一种排序方法,所以就只写了一个方法,如果其他列还有其他排序逻辑的话(应该也不会有)就需要再写一个switch,通过index判断排序算法;
OrderData的思路是,把表当前数据抓出来重排再放进去
public void OrderData(DataTable BigTable, DataGridView dataSource, string order)
{
//获取数据
List<PreDeviceInfo> list = new List<PreDeviceInfo>();
foreach (DataGridViewRow row in dataSource.Rows)
{
PreDeviceInfo info = new PreDeviceInfo();
info.a = row.Cells["a"].Value as String;
info.b= row.Cells["b"].Value as String;
info.c= row.Cells["c"].Value as String;
info.d= row.Cells["d"].Value as String;
if (!string.IsNullOrEmpty(info.a) || !string.IsNullOrEmpty(info.b) || !string.c(info.c) || !string.IsNullOrEmpty(info.d))
list.Add(info);
}
if (list.Count != 0)
{
if (order == "desc") //正序
{
list = list.OrderBy(p => p.a.ToInt()).ToList();
}
else //倒序
{
list = list.OrderByDescending(p => p.a.ToInt()).ToList();
}
dataSource.DataSource = list;
}
}
这里我遇到了一个问题,就是我的表格是可以添加行的,就是除了你有数据的行数以外,下面永远都会有一行空行;如果把表格中所有数据都放在list里面,排序的时候就会把这个空行排在最上面;从用户角度说,这行应该不参与排序;所以我做了一个判断,都为空的话就不把这行数据加进去;后面呢,应该在排完序以后,再add一个新的空行(这段代码里没有,需要自己写一下)
为什么要add一个新的空行呢,因为dataSource被重置以后,这个空行就没有了;除非你这个地方不用list直接赋进去;经过测试,如果用datatable类型的defaultview存进去,就不需要再加新的空行,表格会自动在后面加上;这段我不太理解是为什么,欢迎讨论~