2009-07-25 4 views
0

Je souhaite trouver le nom de colonne de la cellule dans l'événement ci-dessous d'une vue de données.est-il possible de lire le nom de colonne d'une cellule dans gridview?

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

Est-il possible de trouver le nom de la colonne de la cellule que je suis manipulais?

EDIT: Désolé de ne pas donner d'explication claire. Laissez-moi l'expliquer plus clairement.

Je veux faire le formatage ci-dessous uniquement pour les valeurs des colonnes particulières:

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

     } 
    } 
} 

Disons, par exemple, je dois changer le format de la date que pour le « colonne1 » et « Column5 ». Alors maintenant je veux connaître le nom de la colonne et avec cela je veux formater cette colonne seule et laisser le reste.

protected void grvDetailedStatus_ItemDataBound(object sender, DataGridItemEventArgs e) 
{ 
    if (columnName == "Column1") 
    { 
     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

Votre mention datagridview est embrouiller les gens. Il y a deux saveurs: DataGrid et GridView. Vous utilisez un DataGrid. – Thorarin

Répondre

0

Je suppose que vous utilisez un DataGrid. GridView est un contrôle similaire, mais légèrement différent. Je suppose également que vous utilisez des colonnes autogénérées, auquel cas la collection DataGrid.Columns ne vous aidera pas. Au lieu de vérifier les noms de colonne à chaque fois, il est préférable de stocker les index des colonnes qui vous intéressent une fois. Comme ceci:

private List<int> _myColumns; 

protected void grvDetailedStatus_ItemDataBound(object sender, 
    DataGridItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Header) 
    { 
     _myColumns = new List<int>(); 

     for (int i = 0; i < _columnNames.Length; i++) 
     { 
      switch (e.Item.Cells[i].Text) 
      { 
       case "column1": 
       case "column5": 
        // Interesting column, store index 
        _myColumns.Add(i); 
        break; 
      } 
     } 
    } 
    else if (e.Item.ItemType == ListItemType.Item || 
     e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     foreach (int i in _myColumns) 
     { 
      // Your original code: 
      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); 
      } 
     } 
    } 
} 

Si vous vouliez vraiment stocker tous les noms de colonnes, il serait assez facile d'adapter ce code (ou regarder une version antérieure de ce post).

+0

Voulez-vous commenter la version basse? Cela fait exactement ce qu'il a demandé? – Thorarin

+0

Je n'ai pas downvote, mais je parie que vous l'avez eu parce qu'il a posé des questions sur GridViews. Vous avez modifié son post pour inclure une balise pour DataGrid, et répondu dans le contexte de cela. – JoshJordan

+1

Mais il ** utilise ** un DataGrid. GridView n'a aucun événement ItemDataBound et * n'utilise pas 'DataGridItemEventArgs'. Ne me blâmez pas d'être observateur :) – Thorarin

-1

D'abord, vous devez vérifier si le e.Item est un ListItemType.Item ou ListItemType.AlternatingItem ou ListItemType.Header. Si c'est un en-tête, alors vous pouvez obtenir le titre comme suit:

protected void grvDetailedStatus_ItemDataBound(object sender, DataGridItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Header)) 
    { 
     // retrieve the header text... e.g. 
     string FirstCellHeader = e.Item.Cells[0].Text; 
    } 
    else if((e.Item.ItemType == ListItemType.Item) || 
     (e.Item.ItemType == ListItemType.AlternatingItem)) 
    { 
     // your code for items 
    } 
} 
+0

Salut désolé j'ai mis à jour la question plus clairement.S'il vous plaît aider. – Jebli

+0

Votre code a été utile pour moi – Jebli

0

Si vous utilisez à travers les cellules individuelles pendant l'événement ItemDataBound et ont besoin d'obtenir le nom de la colonne d'une cellule, vous pouvez utiliser les éléments suivants:

protected void myDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e) 
{ 
    int i = 0; 
    string colName; 

    foreach (TableCell cell in e.Item.Cells) 
    { 
     //string cellTxt = e.Item.Cells[i].Text; 
     DataRowView dv = (DataRowView)e.Item.DataItem; 
     colName = dv.DataView.Table.Columns[i].ColumnName; 
     i++; 
    } 
} 
Questions connexes