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
Vous devez vous connecter pour publier un commentaire.
Cet article devrait vous diriger dans la bonne direction. Vous pouvez créer par programme la ligne et l'ajouter à la collection, à la position 0.
J'ai pris la accepté de répondre approche, mais a ajouté l'en-tête de l'existant GridView au lieu d'une coutume héritée GridView.
Après je lier mon GridView, je ne les suivants:
Note pour ceux qui choisissent d'utiliser RowDataBound Méthode VB.NET
Si vous vous retrouvez avec trop de lignes d'en-tête supplémentaire jusqu'à éclater, ajouter une Instruction if qui ne procède si le contrôle gridview de la ligne d'en-tête n'est rien (c'est à dire celui qui est actuellement en cours de bound)
Vous aurez à créer une classe qui étend gridview ensuite remplacer le CreateRow méthode.
essayer cette comme un point de départ
Ajouter
t.EnableViewState = false;
après l'ajout de la ligne:Veuillez vous référer à https://stackoverflow.com/a/9333714/1060656
j'ai créé cette solution exemple
À exécuter dans votre système local aurez besoin de créer 2 fichiers ( un pour le contrôle et l'un aspx), vous pouvez soit faire un projet ou 2 projets.
fichier aspx ==> programme de Test
Je voulais faire une tâche similaire, mais nécessaire boutons cliquables à l'intérieur de la tête de rien de ce qui précède travaillé dans ce cas, comme les gestionnaires d'événements n'ont pas été câblé (en raison de l'enchaînement des événements). En fin de compte j'ai utilisé le headertemplate dans la balise appropriée templatefield de l'affichage de la grille. Le html est un peu plus gonflé mais les événements restent intactes sans code supplémentaire derrière l'effort. Par exemple