2009-07-24 10 views
1

Je lis des données d'une feuille Excel et je l'affiche dans une grille de données.Il y a des colonnes de date dans excel.So quand je lis les données de l'Excel et le lie à le dataGridView.La date est affichée dans le format "02/02/2009 12:00:00 AM" mais les données réelles dans la colonne Excel sont au format "02/02/2009". Alors comment changer le format de la date dans le datagridview.Impossible de formater la date dans la colonne de l'ensemble de données, GridView

Depuis que je suis liant les données de l'ensemble de données je n'ai pas toutes les colonnes de modèle ou colonne liée donc je peux ne sais pas où définir la HtmlEncode = « false » DataFormatString = « {0: T} »

Est il n'y a aucun moyen de le faire. S'il vous plaît aidez-moi.

Veuillez trouver l'exemple de code ci-dessous.

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(); 

=========================================== =============== J'ai essayé les

dsExcellData.Tables [0] .Rows [rowcount] [ "date_column"]. ToString()] = dsExcellData.Tables [0 ] .Rows [rowcount] ["date_column"]. ToString()]. ​​ToString ("d");

mais la valeur n'est pas affectée en tant que "mm/jj/aaaa" Elle prend également l'heure par défaut (mm/jj/aaaa hh: mm: ss AM).

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

J'affecte juste l'ensemble de données à la grille. Le problème est que l'ensemble de données lit la colonne de date au format mm/jj/aaaa hh: mm: ss AM.Je suis incapable de changer les données dans le jeu de données aussi.

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

Finaly j'ai obtenu la réponse de SCOTTÉ:

nous devons ajouter le code ci-dessous dans le ItemDataBound du datagridview:

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); 
      } 
     } 

} 
+0

Connaissez-vous à l'avance tous les noms de colonnes, ou est-ce dynamique? – ScottE

+0

Je connaîtrai les noms de colonnes que je vais chercher à partir de DB. – Jebli

Répondre

2

Ok, essayez ceci, où "Item" est le nom de la colonne (peut être multiple) qui est une date qui nécessite un formatage. Ceci est bien sûr vb.net, mais vous pouvez le trier. Je suis sûr qu'il y a un meilleur moyen, mais cela fonctionne.

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 

Ou, si vous ne savez pas quelles colonnes auront les dates, ce qui suit fonctionnera ainsi:

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 
+0

Salut vous êtes le man.Thanks le code fonctionne .Je me sers un gridview et s'il vous plaît trouver le code en C#: dgValidatedData_ItemDataBound1 protected void (object sender, DataGridItemEventArgs e) { for (int i = 0; i <= e.Item.Cells.Count - 1; i ++) { System.DateTime cellDate = valeur par défaut (System.DateTime); if (System.DateTime.TryParse (e.Item.Cells [i] .Text, hors cellDate)) { e.Cellules [i] .Texte = chaîne.Format ("{0: d}", cellDate); } } } } Merci beaucoup – Jebli

+1

Pas de problème. Si cela fonctionne pour vous, notez-le comme correct - il y a trop de questions sans réponse ici déjà! – ScottE

0

Format de date que vous devez définir dans votre colonne GridView. Par exemple:


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

Je n'utilise aucun modèle d'élément. puisque je lie dynamiquement les données .. Je connaîtrai le nom de la colonne du nom de la colonne que je vais récupérer de la base de données. Merci pour votre message. – Jebli

2

Si vous le liant comme asp: BoundField vous devez définir HTMLEncode false.

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

Je n'utilise pas de champ lié à l'asp. Je lie simplement les données à la grille de données à partir d'un ensemble de données. Merci pour votre réponse. – Jebli

0

Voici une solution en utilisant un contrôle personnalisé qui dérive de 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; 
    } 
    } 

} 
+0

Salut désolé de mentionner que je n'utilisais pas C# 3.5.J'utilise C# 2.0 – Jebli

0

Finaly i obtenu la réponse de SCOTTÉ:

nous devons ajouter le code ci-dessous dans l'article databound du datagridview:

dg_ItemDataBound1 protected void (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); 
     } 
    } 

}

Mais le code ci-dessus vérifie toutes les données qui est lié à la datagrig.It va essayer d'analyser les données en tant que datetime dans la cellule. Si c'est un datetime valide, il convertira les données dans le format que nous avons appliqué.

Questions connexes