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',这个是多列一起排序无法实现.. ...
随机推荐
- python3爬虫爬取网页思路及常见问题(原创)
学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...
- NLP初试牛刀,NLTK入门第一篇
之前下载过一个PDF,书名是<用python进行自然语言处理>,挺有意思的,加上NLP和机器学习目前大热,想趁着暑假涉猎一下.于是开始了入门NLP之旅. 安装环境:Ubuntu14.04桌 ...
- [BZOJ 2208] 连通数
Link: BZOJ 2208 连通数 Solution: 传递闭包模板题 传递闭包是集合中最小的二元关系,其实就是对二元关系的不断拓展,一般用$floyd$求解 这里要先跑一遍$tarjan$求出$ ...
- [BZOJ4530]大融合
LCT维护子树信息 维护两个子树信息,$vinf_x$表示节点$x$的所有轻儿子子树信息,$inf_x$表示以$x$为根的LCT子树(包含虚边)的信息 对$vinf$: access时,断开$x$的原 ...
- 【二维单调队列】BZOJ1047-[HAOI2007]理想的正方形
[题目大意] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [思路] 裸的二维单调队列.二维单调队列的思路其实很简单: (1)对于每 ...
- Asp.net Core学习文章
杜现鹏的Asp.net Core文章 EF Core 官方教程 https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new- ...
- Coherence代理的负载均衡
Coherence在extend模式下,proxy的负载均衡机制官方解释是 Extend client connections are load balanced across proxy servi ...
- Difference between val() and text()
.val() works on input elements (or any element with a value attribute?) and .text() will not work on ...
- volatile型变量自增操作的隐患
用FindBugs跑自己的项目,报出两处An increment to a volatile field isn't atomic.对应报错的代码例如以下: volatile int num = ...
- Unity3D之高级渲染-Shader Forge增强版
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家.特邀编辑.畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...