我根据搜索参数在gridview中自动生成列,将添加或删除少量列。
请建议我在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");
}
}
}
这将检查所有记录,然后根据条件进行更改。
但我想做得更好,只需要识别列并更改完整列的日期格式。
答案 0 :(得分:1)
免责声明:我自己没试过,但看起来很可能。
GridView
有一个名为ColumnsGenerator
的公共属性,其类型为IAutoFieldGenerator
。这是确定如何生成列的对象。
那里已经有IAutoFieldGenerator
的实施,默认的是:GridViewColumnsGenerator
。这是一个公开的非密封类,您可以从中派生出类型。
您必须覆盖的方法是:
public override List<AutoGeneratedField> CreateAutoGeneratedFields(
object dataObject, Control control);
注意输出,List&lt; T&gt; 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
之前设置它,因此在创建列时就已经到了。
答案 1 :(得分:1)
我有点晚了。但这对我有用。它仍然使用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}";
}
}
}
}
}
}
}
答案 2 :(得分:0)
如果要将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"));
Actual Source code pulled from here
还要注意你需要检查列和数据类型的存在以及其他检查以消除错误。
希望它有所帮助。
答案 3 :(得分:0)
这是一个相当简单的解决方案:不是单独处理每一行,而是在绑定网格之前设置列。
在以下示例中,view
是生成常规DataTable
的对象,网格视图的AutoGenerateColumns
属性设置为false
。
基本上,你只需要检查列&#39;数据类型及其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();
答案 4 :(得分:0)
我设法格式化自动生成的datetime列的值,实现DataGridView的事件ColumnAdded:
private void dataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
if (e.Column.ValueType == typeof(DateTime))
{
e.Column.DefaultCellStyle.Format = "dd-MMM-yyyy";
}
}
答案 5 :(得分:-1)
使用Eval
函数在aspx代码中定义字符串形成:
<% # Eval("Date", "{0:dd-MMM-yyyy}") %>
完整示例:
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<% # Eval("Date", "{0:dd-MMM-yyyy}") %>
</ItemTemplate>
</asp:TemplateField>