zoukankan      html  css  js  c++  java
  • 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 >= 0)
                    {
                        DataGridView dgv = ((DataGridView)sender);
                        if (e.ColumnIndex == 1)
                        {
                            //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 ? 0 : (cell1 > cell2 ? 1 : -1));
                        e.Handled = true;
                    }
                }
                catch (Exception)
                {
    
                }
            }
    
            private void fillDatagridview(DataGridView dataGridView1, DataTable dt)
            {
                dataGridView1.DataSource = null;
                dataGridView1.Rows.Clear();
                dataGridView1.Columns.Clear();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    dataGridView1.Columns.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    dataGridView1.Rows.Add();
                    for (int j = 0; 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 > 0)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        DateTime time = DateTime.MinValue;
                        if (DateTime.TryParse(dt.Rows[0][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
  • 相关阅读:
    [原]Linux ssh远程连接断开问题处理办法
    【网摘】CURL常用命令
    【树莓派】在树莓派中进行截图
    【树莓派】树莓派移动网络连接(配置4G网卡)
    【树莓派】基于TinyProxy搭建HTTP代理服务器
    【树莓派】制作树莓派所使用的img镜像(二)
    【树莓派】制作树莓派所使用的img镜像(一)
    macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新
    Git使用
    Longest Consecutive Sequence leetcode java
  • 原文地址:https://www.cnblogs.com/xiaochun126/p/5037203.html
Copyright © 2011-2022 走看看