当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具有autogeneratecolumns=true时,如何更改datagridview列的日期格式

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

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

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

你必须重写的方法是:

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

注意输出,List<T> AutoGeneratedFieldAutoGeneratedField具有一个名为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>