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

 

posted on 2015-12-10 20:23  AmyAlisa  阅读(2559)  评论(0编辑  收藏  举报