当gridview具有autogeneratecolumns = true时,如何更改datagridview列日期格式
我根据搜索参数在gridview中自动生成列,将添加或删除少量列。
请建议我为gridview中的整个列设置日期格式为dd-mmm-yyyy
。
现在,我正在使用rowdatabound
。 它检查每一行,因此显示结果需要时间。
这就是我在rowdatabound
中rowdatabound
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
并称之为方法
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}") %>