当gridview具有autogeneratecolumns = true时,如何更改datagridview列日期格式

我根据搜索参数在gridview中自动生成列,将添加或删除少量列。

请建议我为gridview中的整个列设置日期格式为dd-mmm-yyyy

现在,我正在使用rowdatabound 。 它检查每一行,因此显示结果需要时间。

这就是我在rowdataboundrowdatabound

 if (e.Row.RowType == DataControlRowType.DataRow) { System.Data.DataRowView dtview; DateTime dt; int intCounter; dtview = (DataRowView)e.Row.DataItem; for (intCounter = 0; intCounter <= dtview.Row.ItemArray.Length - 1; intCounter++) { if (dtview.Row.ItemArray[intCounter] is System.DateTime) { dt = (DateTime)dtview.Row.ItemArray[intCounter]; e.Row.Cells[intCounter].Text = dt.ToString("dd-MMM-yyyy"); } } } 

这将检查所有记录,然后根据条件进行更改。

但我想做得更好,只需识别列并更改完整列的日期格式。

免责声明:我自己没试过,但看起来有可能。

GridView有一个名为ColumnsGenerator的公共属性,它具有一种IAutoFieldGenerator类型。 这是确定如何生成列的对象。

已经有IAutoFieldGenerator的实现,默认的一个: GridViewColumnsGenerator 。 这是一个公开的非密封类,您可以从中派生出类型。

您必须覆盖的方法是这样的:

 public override List CreateAutoGeneratedFields( object dataObject, Control control); 

注意输出, AutoGeneratedField的List AutoGeneratedField有一个名为DataFormatString的属性:

 public override string DataFormatString { get; set; } 

所以你要做的就是覆盖CreateAutoGeneratedFields ,如下所示:

 public class MyDerivedGridViewColumnsGenerator : GridViewColumnsGenerator { public override List CreateAutoGeneratedFields( object dataObject, Control control) { var list = base.CreatedAutoGeneratedFields(dataObject, control); foreach(var field in list) { if(field.DataType == typeof(DateTime)) field.DataFormatString = "dd-MMM-yyyy"; } return list; } } 

现在,我不清楚如何设置ColumnsGenerator属性,因此您可能必须在代码中执行此操作。 但这应该相当简单,因为GridViewColumnsGenerator有一个无参数构造函数:

  // GridView myGridView; myGridView.ColumnsGenerator = new MyDerivedGridViewColumnsGenerator(); 

我会在绑定到GridView之前设置它,所以在创建列时它就到位了。

我有点晚了。 但这对我有用。 它仍然使用RowDataBound()方法。 但它只针对数据源中的第一行运行。

  protected void gvGridView_RowDataBound(Object sender, GridViewRowEventArgs e) { DataRowView drv = (DataRowView)e.Row.DataItem; if (e.Row.RowType == DataControlRowType.DataRow) { for (int i = 0; i < ct_columns; i++) { DataControlFieldCell dcf = e.Row.Cells[i] as DataControlFieldCell; /* default date format: hide 'time' values */ if (e.Row.RowIndex == 0 && (dcf.ContainingField.GetType().Name == "BoundField" // defined columns || dcf.ContainingField.GetType().Name == "AutoGeneratedField")) // auto-generated columns { BoundField bf = dcf.ContainingField as BoundField; if (bf != null && String.IsNullOrEmpty(bf.DataFormatString)) { string col_name = bf.DataField; if (!String.IsNullOrEmpty(col_name) && drv[col_name] != null) { if (drv[col_name].GetType().Name == "DateTime") { // set format for first row string date = drv[col_name].ToString(); if (!String.IsNullOrEmpty(date)) dcf.Text = DateTime.Parse(date).ToShortDateString(); // set format for other rows bf.DataFormatString = "{0:M/dd/yyyy}"; } } } } } } } 

如果要将DataTable绑定到Grid,则编写扩展方法或链接Query

 public static void ChangeDateFormat(this DataColumn column, Func conversion) { foreach(DataRow row in column.Table.Rows) { row[column] = conversion(row[column]); } } 

并称之为方法

 dataTable.Columns["DateColumanName"].ChangeDateFormat( val => DateTime.Parse(val.ToString()).ToString("dd/MMM/yyyy")); 

从这里拉出实际源代码
并且还要注意,您需要检查列和数据类型的存在以及其他检查以消除错误。

希望能帮助到你。

这是一个相当简单的解决方案:不是单独处理每一行,而是绑定网格之前设置列。

在以下示例中, view是一个生成常规DataTable的对象,并且网格视图的AutoGenerateColumns属性设置为false

实质上,您只需检查列的数据类型,并在其DateTime ,设置所需的格式。

 DataTable dt = view.GetReport(); Type dateType = typeof(DateTime); foreach (DataColumn column in dt.Columns) { BoundField f = new BoundField(); f.HeaderText = column.ColumnName; f.DataField = column.ColumnName; if(column.DataType == dateType) f.DataFormatString = "{0:d}"; // Or whatever gvReport.Columns.Add(f); } gvReport.DataSource = dt; gvReport.DataBind(); 

我设法格式化自动生成的datetime列的值,实现DataGridView的事件ColumnAdded:

  private void dataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e) { if (e.Column.ValueType == typeof(DateTime)) { e.Column.DefaultCellStyle.Format = "dd-MMM-yyyy"; } } 

使用Eval函数在aspx代码中定义字符串形成:

 <% # Eval("Date", "{0:dd-MMM-yyyy}") %> 

完整示例:

   <% # Eval("Date", "{0:dd-MMM-yyyy}") %>