Cela dépend de votre définition d'un "nouveau GridView". La réponse est encore, mais à un coût.
Si vous basez votre contrôle sur WebControl, vous pouvez écrire un nouveau contrôle de grille avec n'importe quelle fonctionnalité. D'une certaine manière, je ne pense pas que ce soit ce que vous avez en tête.
Si vous souhaitez hériter de GridView existant et ajouter des contrôles supplémentaires, il est également possible, mais avec de fortes limitations. La raison en est que l'implémentation de GridView casse toutes les directives possibles pour l'extensibilité. Je suppose que parce qu'ils ne l'ont jamais voulu prolonger. Par exemple, ils effacent la collection Controls presque à chaque occasion et attendent explicitement que les contrôles [0] soient une table. Je suppose que si vous décidez de rester dans les limites de la disposition de la table (en-tête, pied de page et tout), vous aurez peut-être plus de place pour jouer.
Enfin, vous pouvez créer un wrapper, qui a un GridView comme membre privé et simplement exposer tout ce dont vous avez besoin et plus. Mais cela devient laid très rapidement.
Voici une démonstration brute (travail) de la seconde approche. Notez que le menu déroulant est à la fin. Vous pouvez remplacer la méthode Render, mais vous devrez recréer beaucoup de code MS.
ExtendedGridView
public class ExtendedGridView : GridView
{
protected DropDownList DropDown { get; set; }
public ExtendedGridView() : base()
{
this.DropDown = new DropDownList();
this.DropDown.Items.Add("white");
this.DropDown.Items.Add("red");
this.DropDown.Items.Add("blue");
this.DropDown.Items.Add("green");
this.DropDown.AutoPostBack = true;
this.DropDown.ID = "dropdown";
this.DropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged);
}
void DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
BackColor = System.Drawing.Color.FromName(this.DropDown.SelectedValue);
}
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
int itemCount = base.CreateChildControls(dataSource, dataBinding);
Controls.Add(this.DropDown);
return itemCount;
}
}
SomePage.aspx
<%@ Register TagPrefix="my" Namespace="MyProject" Assembly="MyProject" %>
<my:ExtendedGridView id="myGridView" runat="server" onpageindexchanging="myGridView_PageIndexChanging"></my:ExtendedGridView>
SomePage.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
myGridView.DataSource = new string[] { "aaa", "bbb", "ccc", "ddd", "eee" };
myGridView.AllowPaging = true;
myGridView.PageSize = 2;
myGridView.DataBind();
}
protected void myGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
myGridView.PageIndex = e.NewPageIndex;
myGridView.DataBind();
}