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. POJ 2367 Genealogical tree【拓扑排序/记录路径】

    Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7101 Accepted: 4585 Spe ...

  2. codeforces Round #440 C Maximum splitting【数学/素数与合数/思维/贪心】

    C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. codeforces 868B The Eternal Immortality【暴力+trick】

    B. The Eternal Immortality time limit per test 1 second memory limit per test 256 megabytes input st ...

  4. ActiveMQ学习总结

    一.消息中间件的产生的背景 1.在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式 2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能 ...

  5. centos中pyenv安装

    1.先安装git yum install git -y 2.克隆pyenv到本地 git clone git://github.com/yyuu/pyenv.git .pyenv 或自动安装 curl ...

  6. uva10256

    uva10256 题意 平面上存在两种颜色的点,问是否存在一条直线,使得任取一个红点和一个蓝点都在直线的异侧,这条直线不经过任何点. 分析 对每种颜色的点求一发凸包,问题等价于判断两个多边形是否相交或 ...

  7. volatile 和 Interlocked

    class Volatile_Test3 { ; public static void Test() { count = ; Task[] tasks = ]; ; i < tasks.Leng ...

  8. Windows 10 作为无线显示器无法被搜索到

    症状描述: Windows 10 的投影到此电脑功能失效,但是其它功能正常.同一网络,室友的电脑正常. 解决办法: 设备管理器启用“Microsoft Wi-Fi Direct Virtual Ada ...

  9. 【二分图】【最大匹配】【匈牙利算法】bzoj1191 [HNOI2006]超级英雄Hero

    裸的最大匹配. #include<cstdio> #include<vector> #include<cstring> using namespace std; v ...

  10. CSS3: box-shadow 阴影

    box-shadow是给元素块添加周边阴影效果 语法: 对象选择器 {box-shadow:X轴偏移量 Y轴偏移量阴影 模糊半径 阴影扩展半径 阴影颜色 [投影方式] } box-shadow: h- ...