2009-09-14 9 views
2

J'ai créé un contrôle qui étend le contrôle BoundField pour effectuer un traitement spécial sur les données qui y sont passées.Comment puis-je changer le type de champ sur un GridView à l'exécution avec AutoGenerate = "True"?

J'ai maintenant une grille qui a AutoGenerateColumns = "true", par lequel je voudrais intercepter le HeaderText, voir si c'est une valeur particulière, puis permuter dans le "SpecialBoundField" à la place. J'ai essayé d'utiliser l'événement OnDataBinding pour faire une boucle dans les colonnes, mais à ce stade, il n'y a pas de colonnes dans la grille. Je pense que RowDataBound et DataBound sont trop tard dans le jeu, donc je ne sais pas quoi faire.

Ma pensée suivante était de passer outre le contrôle du réseau lui-même pour ajouter un événement « AutoGeneratingColumn » dans

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties) 

peut-elle aider quelqu'un ou me diriger dans une meilleure direction? Merci!

Répondre

3

Si les deux champs reviennent dans l'ensemble de données, je suggère de définir les visibilités des colonnes au lieu d'essayer d'ajouter ou de modifier dynamiquement les champs de données. Les colonnes invisibles ne génèrent pas de code HTML. Il suffit donc de regarder la ligne d'en-tête lorsqu'elle est liée, de vérifier le champ qui vous intéresse et de définir la visibilité de la colonne.

void myGridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
    { 

    if (e.Row.RowType == DataControlRowType.Header) 
    { 
     if (e.Row.Cells[1].Text = "BadText") 
     { 
     myGridView.Columns[1].Visible = false; 
     myGridView.Columns[5].Visible = true; 
     } 
    } 
    } 
+0

Cela peut fonctionner, mais je besoin de changer le type de colonne réelle de la simple « BoundField » à « SpecialBoundField » aussi bien. Je vais essayer et rendre compte. – rball

+0

Je suis arrivé là où je devais aller, ma solution est également affichée ... – rball

1

Ce que je fini avec:

public class SpecialGridView : GridView 
{ 
    protected override void OnRowDataBound(GridViewRowEventArgs e) 
    { 
     ModifyData(e); 
     base.OnRowDataBound(e); 
    } 

    IList<string> _columnNames = new List<string>(); 
    protected void ModifyData(GridViewRowEventArgs e) 
    { 
     LoadColumnNames(e); 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      for (int i = 0; i < e.Row.Cells.Count; i++) 
      { 
       string currentColumnName = _columnNames[i]; 
       if (IsSpecialColumn(currentColumnName)) 
       { 
        string text = e.Row.Cells[0].Text; 
        bool isSpecialData = text.ToUpper() == "Y"; 

        if (isSpecialData) 
        { 
         e.Row.Cells[i].CssClass += " specialData"; 
        } 
       } 
      } 
     } 
    } 

    private void LoadColumnNames(GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.Header) 
     { 
      foreach (TableCell cell in e.Row.Cells) 
      { 
       _columnNames.Add(cell.Text); 
      } 
     } 
    } 

    private bool IsSpecialColumn(string currentColumnName) 
    { 
     foreach (string columnName in SpecialColumnNames) 
     { 
      if (currentColumnName.ToUpper() == columnName.ToUpper()) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    private IList<string> _specialColumnNames = new List<string>(); 
    public IList<string> SpecialColumnNames 
    { 
     get { return _specialColumnNames; } 
     set { _specialColumnNames = value; } 
    } 
} 
Questions connexes