datagridview 日期列排序
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 日期列排序的更多相关文章
- DataGridView 多列排序功能
System.Data.DataTable dt = new System.Data.DataTable(); private void FillDataGridView() { dt.Columns ...
- .NET组件控件实例编程系列——5.DataGridView数值列和日期列
在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会自动显示对应类型的列.当然我们自己可以手工选择列的类型,例如ComboBox列.Button列.Link列. ...
- DataGridView数值列和日期列
本文转自:http://www.cnblogs.com/conexpress/p/5923324.html 在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会 ...
- DataGridView的自定义列排序
1,将需要进行排序的列做属性的设置 this.colUserName.SortMode = DataGridViewColumnSortMode.Programmatic; 2,添加列的事件 //点击 ...
- DataGridView点击排序完成后如何禁止自动排序
Summary: Disable sorting after clicking DataGridView columnheader,Prevent databound DataGridView fro ...
- 怎么自定义DataGridViewColumn(日期列,C#)
参考:https://msdn.microsoft.com/en-us/library/7tas5c80.aspx 未解决的问题:如果日期要设置为null,怎么办? DataGridView控件提供了 ...
- 数据可视化之powerBI基础(十七)掌握PowerBI按列排序,再也不用担心顺序错乱了
https://zhuanlan.zhihu.com/p/64421933 经常有朋友问,当把文本字段放到坐标轴或者切片器上,显示的顺序都乱了,完全不是自己想要的,就像下面这些, ↑月份坐标轴 ↑星期 ...
- Jtable 表格按多列排序(支持中文汉字排序)
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
- easyUI datagraid的列排序
在给datagraid做多列排序时请注意: 首先,做的是后台排序,那么需要设置: remoteSort:'true', 然后,不要添加 multiSort:'true',这个是多列一起排序无法实现.. ...
随机推荐
- [thinkphp] 公共头部底部如何传递数据
分组底下有一个公共模板文件夹 Modules/Index/Tpl/public/ 如何传递数据给模板呢? 在 入口文件/Lib/Action/ 中创建类CommonAction.class.php ...
- Web开发基础(读书笔记)
读书笔记:简单+基础 HTML(hyper Text Markup Language,超文本标记语言) URL(Uniform Resource Locator,统一资源定位器)构成3部分:协议/主机 ...
- python3爬虫爬取煎蛋网妹纸图片(下篇)2018.6.25有效
分析完了真实图片链接地址,下面要做的就是写代码去实现了.想直接看源代码的可以点击这里 大致思路是:获取一个页面的的html---->使用正则表达式提取出图片hash值并进行base64解码--- ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- 【数论】【快速幂】CODEVS 2952 细胞分裂 2
裸快速幂取模,背诵模板用. #include<cstdio> using namespace std; typedef long long LL; LL n=,m,q; LL Quick_ ...
- 【计算几何】【凸包】bzoj1670 [Usaco2006 Oct]Building the Moat护城河的挖掘
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- 十. 图形界面(GUI)设计13.鼠标事件
鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionL ...
- JavaScript异步编程的Promise模式(转)
异步模式在web编程中变得越来越重要,对于web主流语言Javascript来说,这种模式实现起来不是很利索,为此,许多Javascript库(比如 jQuery和Dojo)添加了一种称为promis ...
- 使用原生JS进行字符串转对象
字符串转对象 目的 工作中如果需要原生 JS 完成字符转对象的话可以通过 JSON.parse(str), 但是这个方法是ES5中才出现, 如果需要兼容低版本就需要其它方法 使用原生 JS 解决字符串 ...
- S3C2440时钟配置
参考: http://blog.csdn.net/mr_raptor/article/details/6555734 http://blog.csdn.net/mjx91282041/article/ ...