2009-03-13 5 views
1

Ceci est en partie en référence à ceci:Est-il possible de faire un gridview avec une liste déroulante comme un nouveau contrôle?

Why isn't the SelectedIndexChanged event firing from a dropdownlist in a GridView?

Je pensais assez différent de poser une autre question. Ma pensée est qu'au lieu d'ajouter une dropdownlist (ddl) à un gridview et en utilisant la technique ci-dessus que je pourrais créer un nouveau contrôle qui a un ddl dedans et la référence directement.

Il s'agit plus d'un comment créer des contrôles asp.net 2.0+, je pense, mais est ce que je demande possible? Pouvez-vous faire un "nouveau" contrôle gridview qui se contente d'avoir toujours un ddl et de s'y référer (en quelque sorte) sans findcontrol et tout le reste? Je réalise qu'il serait hautement personnalisé pour une application unique. J'essaie juste de voir si c'est possible car je pourrais vouloir l'utiliser pour créer d'autres contrôles.

Merci.

Répondre

2

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(); 
} 
Questions connexes