ASP.NET GridView deuxième ligne d'en-tête à la travée principale ligne d'en-tête

J'ai un ASP.NET GridView qui a des colonnes qui ressemblent à ceci:

| Foo | Bar | Total1 | Total2 | Total3 |

Est-il possible de créer un en-tête sur les deux lignes qui ressemble à ceci?

|           |  Totals   |    
| Foo | Bar | 1 | 2 | 3 |

Les données dans chaque ligne demeureront inchangés, comme c'est juste à peu jusqu'à l'en-tête et de diminuer l'espace horizontal que la grille prend.

L'ensemble de la GridView est triable dans le cas où des questions. Je n'ai pas l'intention de l'ajout de "Totaux" couvrant la colonne d'avoir toute la fonctionnalité de tri.

Edit:

Basé sur l'un des articles ci-dessous, j'ai créé une classe qui hérite de GridView et ajoute de la deuxième ligne d'en-tête.

namespace CustomControls
{
    public class TwoHeadedGridView : GridView
    {
        protected Table InnerTable
        {
            get
            {
                if (this.HasControls())
                {
                    return (Table)this.Controls[0];
                }

                return null;
            }
        }

        protected override void OnDataBound(EventArgs e)
        {
            base.OnDataBound(e);
            this.CreateSecondHeader();
        }

        private void CreateSecondHeader()
        {
            GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);

            TableCell left = new TableHeaderCell();
            left.ColumnSpan = 3;
            row.Cells.Add(left);

            TableCell totals = new TableHeaderCell();
            totals.ColumnSpan = this.Columns.Count - 3;
            totals.Text = "Totals";
            row.Cells.Add(totals);

            this.InnerTable.Rows.AddAt(0, row);
        }
    }
}

Dans le cas où vous êtes nouveau à ASP.NET comme je suis, je dois aussi souligner que vous avez besoin de:

1) Inscrivez votre classe en ajoutant une ligne comme ceci à votre formulaire web:

<%@ Register TagPrefix="foo" NameSpace="CustomControls" Assembly="__code"%>

2) Changement asp:GridView dans votre précédent balisage toto:TwoHeadedGridView. N'oubliez pas la balise de fermeture.

Un autre edit:

Vous pouvez également le faire sans créer une classe personnalisée.

Simplement ajouter un gestionnaire d'événements pour l'événement DataBound de votre grille comme ceci:

protected void gvOrganisms_DataBound(object sender, EventArgs e)
{
    GridView grid = sender as GridView;

    if (grid != null)
    {
        GridViewRow row = new GridViewRow(0, -1,
            DataControlRowType.Header, DataControlRowState.Normal);

        TableCell left = new TableHeaderCell();
        left.ColumnSpan = 3;
        row.Cells.Add(left);

        TableCell totals = new TableHeaderCell();
        totals.ColumnSpan = grid.Columns.Count - 3;
        totals.Text = "Totals";
        row.Cells.Add(totals);

        Table t = grid.Controls[0] as Table;
        if (t != null)
        {
            t.Rows.AddAt(0, row);
        }
    }
}

L'avantage de la coutume est que vous pouvez voir la ligne d'en-tête supplémentaire sur la vue de la conception de votre formulaire web. La méthode de gestionnaire d'événements est un peu plus simple, mais.

  • la mise à jour de la réponse m'a beaucoup aidé, je vous remercie de prendre le temps de le documenter
  • Même ici - merci de remplir les blancs
  • Remarque - j'ai trouvé, j'ai dû ajouter row.TableSection = TableRowSection.TableHeader pour que le code fonctionne sans erreur