1、datagridview 日期列排序

        private void Form1_Load(object sender, EventArgs e)
{
//方法1
dataGridView1.ColumnHeaderMouseClick += tempView_ColumnHeaderMouseClick;
DataTable dt = Create();
dataGridView1.DataSource = dt; //方法2
dataGridView2.SortCompare += dataGridView2_SortCompare;
fillDatagridview(dataGridView2, dt);
} #region 方法1,已知那一列是日期类型,以datasourcr方式绑定数据
//创建表,为了culture的原因,日期列的数据源类型是字符串而不是日期类型
public DataTable Create()
{
DataTable dt = new DataTable();
try
{
dt.Columns.Add("name");
dt.Columns.Add("birthdate");
dt.Rows.Add("m", "04.01.1969");
dt.Rows.Add("n", "05.12.1961");
dt.Rows.Add("n", "06.04.1963"); }
catch (Exception)
{
throw;
} return dt;
} //方法1,已知那一列是日期类型,以datasourcr方式绑定数据
void tempView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
try
{
if (e.ColumnIndex >= )
{
DataGridView dgv = ((DataGridView)sender);
if (e.ColumnIndex == )
{
//foreach (DataRow row in dt.Rows.Cast<DataRow>().OrderBy(r => DateTime.Parse(r["birthdate"].ToString())))
DataTable dt = (DataTable)dgv.DataSource;
DataTable dtNew = new DataTable();
if (dgv.Tag == null || dgv.Tag.ToString() == "Desc")
{
dgv.Tag = "Asc";
dtNew = dt.Rows.Cast<DataRow>().OrderBy(r => DateTime.Parse(r["birthdate"].ToString())).CopyToDataTable();
}
else
{
dgv.Tag = "Desc";
dtNew = dt.Rows.Cast<DataRow>().OrderByDescending(r => DateTime.Parse(r["birthdate"].ToString())).CopyToDataTable();
}
dgv.DataSource = null;
dgv.DataSource = dtNew;
}
}
}
catch
{ }
}
#endregion #region 方法2 SortCompare,:只适用非datasource方式绑定的数据源,所以用这个方法数据必须一行行添加到gridview
//方法2:只适用非datasource方式绑定的数据源
//并且this.Columns[i].SortMode = DataGridViewColumnSortMode.Programmatic; void dataGridView2_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
CompareDate(e);
}
//按照日期比较
private static void CompareDate(DataGridViewSortCompareEventArgs e)
{
try
{
DateTime cell1 = DateTime.MinValue;
DateTime cell2 = DateTime.MinValue;
bool t1 = DateTime.TryParse(e.CellValue1.ToString(), out cell1);
bool t2 = DateTime.TryParse(e.CellValue2.ToString(), out cell2);
if (t1 && t2)
{
e.SortResult = System.DateTime.Compare(cell1, cell2);
e.Handled = true;
}
}
catch (Exception)
{ }
}
//按照数字比较
private static void CompareNumber(DataGridViewSortCompareEventArgs e)
{
try
{
Decimal cell1 = Decimal.MinValue;
Decimal cell2 = Decimal.MinValue;
bool t1 = Decimal.TryParse(e.CellValue1.ToString(), out cell1);
bool t2 = Decimal.TryParse(e.CellValue2.ToString(), out cell2);
if (t1 && t2)
{
e.SortResult = (cell1 == cell2 ? : (cell1 > cell2 ? : -));
e.Handled = true;
}
}
catch (Exception)
{ }
} private void fillDatagridview(DataGridView dataGridView1, DataTable dt)
{
dataGridView1.DataSource = null;
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
for (int i = ; i < dt.Columns.Count; i++)
{
dataGridView1.Columns.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
for (int i = ; i < dt.Rows.Count; i++)
{
dataGridView1.Rows.Add();
for (int j = ; j < dt.Columns.Count; j++)
{
dataGridView1.Rows[i].Cells[j].Value = dt.Rows[i][j];
}
}
} #endregion #region 其他方法,改变列数据类型
//由于种种原因,dgv上绑定的数据表里面的日期类型是字符串(为了适用各个国家的日期格式,日期类型专门做了格式化),后期再改回正确类型
//在有数据的情况下,列类型是不能修改的,所以用临时列
public static void ChangeColumnDataType(DataGridView dgv)
{
DataTable dt = (DataTable)dgv.DataSource;
if (dt.Rows.Count > )
{
for (int i = ; i < dt.Columns.Count; i++)
{
DateTime time = DateTime.MinValue;
if (DateTime.TryParse(dt.Rows[][i].ToString(), out time))
{
ChangeColumnDataType(dt, dt.Columns[i].ColumnName, typeof(DateTime));
}
} }
}
public static bool ChangeColumnDataType(DataTable table, string columnname, Type newtype)
{
if (table.Columns.Contains(columnname) == false)
return false; DataColumn column = table.Columns[columnname];
if (column.DataType == newtype)
return true; try
{
DataColumn newcolumn = new DataColumn("temporary", newtype);
table.Columns.Add(newcolumn);
foreach (DataRow row in table.Rows)
{
try
{
row["temporary"] = Convert.ChangeType(row[columnname], newtype);
}
catch
{
}
}
table.Columns.Remove(columnname);
newcolumn.ColumnName = columnname;
}
catch (Exception)
{
return false;
} return true;
}
#endregion

datagridview 日期列排序的更多相关文章

  1. DataGridView 多列排序功能

    System.Data.DataTable dt = new System.Data.DataTable(); private void FillDataGridView() { dt.Columns ...

  2. .NET组件控件实例编程系列——5.DataGridView数值列和日期列

    在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会自动显示对应类型的列.当然我们自己可以手工选择列的类型,例如ComboBox列.Button列.Link列. ...

  3. DataGridView数值列和日期列

    本文转自:http://www.cnblogs.com/conexpress/p/5923324.html 在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会 ...

  4. DataGridView的自定义列排序

    1,将需要进行排序的列做属性的设置 this.colUserName.SortMode = DataGridViewColumnSortMode.Programmatic; 2,添加列的事件 //点击 ...

  5. DataGridView点击排序完成后如何禁止自动排序

    Summary: Disable sorting after clicking DataGridView columnheader,Prevent databound DataGridView fro ...

  6. 怎么自定义DataGridViewColumn(日期列,C#)

    参考:https://msdn.microsoft.com/en-us/library/7tas5c80.aspx 未解决的问题:如果日期要设置为null,怎么办? DataGridView控件提供了 ...

  7. 数据可视化之powerBI基础(十七)掌握PowerBI按列排序,再也不用担心顺序错乱了

    https://zhuanlan.zhihu.com/p/64421933 经常有朋友问,当把文本字段放到坐标轴或者切片器上,显示的顺序都乱了,完全不是自己想要的,就像下面这些, ↑月份坐标轴 ↑星期 ...

  8. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  9. easyUI datagraid的列排序

    在给datagraid做多列排序时请注意: 首先,做的是后台排序,那么需要设置: remoteSort:'true', 然后,不要添加 multiSort:'true',这个是多列一起排序无法实现.. ...

随机推荐

  1. VS code 的变量设定

    文档来自https://code.visualstudio.com/docs/editor/variables-reference 预定义的变量有: ${workspaceFolder} - the ...

  2. 【kd-tree】bzoj4066 简单题

    同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...

  3. 微服务之SpringCloud实战(五):SpringCloud Eureka详解

    Eureka详解 在第三节高可用中,实际已经讲解了服务的注册,只不过注册的是Eureka本身,原理相同,通过这几篇文章我相信大家对Eureka有了一定的了解,三个核心角色:服务注册中心.服务提供者和服 ...

  4. python内建datetime模块

    datetime 获取当前日期和时间 from datetime import datetime now = datetime.now() print(now) datetime转换为timestam ...

  5. Android Studio 中修改versionCode跟versionName

    在Android Studio 中修改versionCode 跟versionName最写了一个新版的软件准备发布到应用平台上,但是versionCode和versionName的值一直修改不成功,在 ...

  6. glib wpa_supplicant Unix上库编译错误解决与总结

    编译Linux下的库是一件痛苦的事情,这里主要阐述glib和wpa_supplicant库的编译,因各自的依赖关系,另外一些库要事先编译.glib依赖libffi和zlib,而wpa_supplica ...

  7. [Android Pro] 通过Android trace文件分析死锁ANR

    转载自: http://blog.csdn.net/oujunli/article/details/9102101#reply 对于从事Android开发的人来说,遇到ANR(Application ...

  8. 13、mha高可用架构搭建

    各节点架构: 192.168.1.20(mysql5.5) master主库 192.168.1.21(mysql5.5) slave1,目标:主库宕可提升为主库 192.168.1.22(mysql ...

  9. LNMP第二部分nginx、php配置

    内容概要:一. nginx.confvim /usr/local/nginx/conf/nginx.conf //清空原来的配置,加入如下内容:user nobody nobody;worker_pr ...

  10. javascript快速入门10--运算符,语句

    一元运算符 一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete 运算符删除对以前定义的对象属性或方法的引用.例如: var obj = new ...