当gridview具有autogeneratecolumns=true时,如何更改datagridview列的日期格式
本文关键字:datagridview 何更改 格式 日期 具有 gridview autogeneratecolumns true | 更新日期: 2023-09-27 18:22:45
我在gridview中根据搜索参数自动生成列,很少会添加或删除列。
请建议我一种方法,将日期格式设置为网格视图中整列的dd-mmm-yyyy
。
目前,我正在使用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<AutoGeneratedField> CreateAutoGeneratedFields(
object dataObject, Control control);
注意输出,List<T> AutoGeneratedField
。AutoGeneratedField
具有一个名为DataFormatString
:的属性
public override string DataFormatString { get; set; }
所以你所要做的就是覆盖CreateAutoGeneratedFields
,就像这样:
public class MyDerivedGridViewColumnsGenerator : GridViewColumnsGenerator
{
public override List<AutoGeneratedField> 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<T>(this DataColumn column, Func<object, T> 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();
我成功地格式化了自动生成的日期时间列的值,该列实现了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}") %>
完整示例:
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<% # Eval("Date", "{0:dd-MMM-yyyy}") %>
</ItemTemplate>
</asp:TemplateField>