无法在数据集列GridView中格式化日期

时间:2009-07-24 10:35:31

标签: asp.net excel datagridview binding

我正在从Excel工作表中读取数据并将其显示在数据网格视图中。在Excel中有一些日期列。当我从excel读取数据并将其绑定到dataGridView时。日期显示在格式“02/02/2009 12:00:00 AM”但excel列中的实际数据格式为“2/2/2009”。那么如何更改datagridview中的日期格式。

由于我绑定了数据集中的数据,我没有任何模板列或绑定列集,所以我不知道在哪里设置HtmlEncode =“False”DataFormatString =“{0:T}”

有没有办法做到这一点。请帮帮我。

请找到以下代码示例。

string OleDbConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "+ FileUpload1.PostedFile.FileName + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";

string strSheetName = "Sheet1";
OleDbConnection oledbConnection;
OleDbCommand oledbCommand;
OleDbDataAdapter oledbAdapter;

oledbCommand = new OleDbCommand();
oledbAdapter = new OleDbDataAdapter();
DataSet dsExcellData = new DataSet();

oledbConnection = new OleDbConnection(OleDbConnection);
oledbConnection.Open();
oledbCommand.Connection = oledbConnection;


oledbCommand.CommandText = "Select * from [" + strSheetName + "$]"; // i want to find this sheet name
oledbAdapter.SelectCommand = oledbCommand;
oledbAdapter.Fill(dsExcellData);

oledbConnection.Close();

GridView1.DataSource = dsExcellData.Tables[0];

GridView1.DataBind();

=============================================== =========== 我试过了

dsExcellData.Tables [0] .Rows [rowcount] [“date_column”]。ToString()] = dsExcellData.Tables [0] .Rows [rowcount] [“date_column”]。ToString()]。ToString(“ d“);

但是该值未被指定为“mm / dd / yyyy”它也会再次占用默认时间(mm / dd / yyyy hh:mm:ss AM)。

=============================================== ==============

我只是将数据集分配给gridview。问题是数据集正在以mm / dd / yyyy hh:mm:ss AM格式读取日期列。我无法更改数据集中的数据

=============================================== ==============

最后我得到了ScottE的回答:

我们必须在datagridview的itemdatabound中添加以下代码:

protected void dgValidatedData_ItemDataBound1(object sender, DataGridItemEventArgs e)
{

        for (int i = 0; i <= e.Item.Cells.Count - 1; i++)
        {
            System.DateTime cellDate = default(System.DateTime);
            if (System.DateTime.TryParse(e.Item.Cells[i].Text, out cellDate))
            {
                e.Item.Cells[i].Text = string.Format("{0:d}", cellDate);
            }
        }

} 

5 个答案:

答案 0 :(得分:2)

如果你将它绑定为asp:BoundField,你需要将htmlencode设置为false。

<asp:BoundField HtmlEncode="false" DataField="Blah" DataFormatString="{0:d}" />

答案 1 :(得分:2)

好的,试试这个,其中“Item”是列名(可能是多个),这是一个需要格式化的日期。这当然是vb.net,但你可以解决这个问题。我确信有更好的方法,但这很有效。

Protected Sub gv_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        For i As Integer = 0 To e.Row.Cells.Count - 1
            If gv.HeaderRow.Cells(i).Text = "Item" Then
                e.Row.Cells(i).Text = String.Format("{0:d}", CType(e.Row.Cells(i).Text, Date))
            End If
        Next
    End If
End Sub

或者,如果您不知道哪些列具有日期,则以下内容也将起作用:

Protected Sub gv_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        For i As Integer = 0 To e.Row.Cells.Count - 1
            Dim cellDate As Date
            If Date.TryParse(e.Row.Cells(i).Text, cellDate) Then
                e.Row.Cells(i).Text = String.Format("{0:d}", cellDate)
            End If
        Next
    End If
End Sub

答案 2 :(得分:0)

您应在GridView列中定义的日期格式。例如:


<asp:GridView>
...
<asp:TemplateField>
 <ItemTemplate>
   <asp:Label ID="Label1" runat="server" Text='<%# Eval("Date", "{0:T}") %>'></asp:Label>
  </ItemTemplate>
...
</asp:GridView>

答案 3 :(得分:0)

以下是使用从GridView派生的自定义控件的解决方案:

using System;
using System.Collections;
using System.Web.UI.WebControls;

namespace CustomControls {

  public class FormattedGridView : GridView {

    protected override ICollection CreateColumns(PagedDataSource dataSource, bool useDataSource) {

      // Call base method and return the collection as an ArrayList
      var columns = (ArrayList) base.CreateColumns(dataSource, useDataSource);

      for (var i = 0; i < columns.Count; i++) {

        var agf = columns[i] as AutoGeneratedField;

        if (agf != null && agf.DataType == typeof(DateTime)) {

          // create a new column because the AutoGeneratedField does not support
          // the modification of the DataFormatString property
          var bf = new BoundField();

          // copy some of the original properties
          bf.DataField = agf.DataField;
          bf.HeaderText = agf.HeaderText;
          bf.HtmlEncode = false;

          // set the format for the DateTime types
          bf.DataFormatString = "{0:T}";

          // replace the existing auto-generated colums
          columns[i] = bf;
        }

      }

      return columns;
    }
  }

}

答案 4 :(得分:0)

最后我得到了ScottE的回答:

我们必须在datagridview的itemdatabound中添加以下代码:

protected void dg_ItemDataBound1(object sender,DataGridItemEventArgs e) {

    for (int i = 0; i <= e.Item.Cells.Count - 1; i++)
    {
        System.DateTime cellDate = default(System.DateTime);
        if (System.DateTime.TryParse(e.Item.Cells[i].Text, out cellDate))
        {
            e.Item.Cells[i].Text = string.Format("{0:d}", cellDate);
        }
    }

}

但是上面的代码将检查绑定到datagrig的所有数据。它会尝试将数据解析为单元格中的日期时间。如果它是一个有效的日期时间,那么它会将数据转换为我们应用的格式。