Bonjour,

J'ai surchargé le composant GridView pour modifier un peu les fonctionnalités du pagineur. Notamment, j'y ai inséré un contrôle Template pour y faire figurer des ImageButton (qui servent en cas d'actions à effectuer sur des sélections multiples).

Pour la création de ce controle template, j'ai suivi le tutoriel Introduction aux contrôles templates dispo sur ce site.

Un problème, pour le gridView, est que j'ai beau ajouter mon contrôle dans la méthode CreateChilControl, au rendu, il ne reste que le tableau du gridview.

J'ai donc après plusieurs tentatives infrucuteuses, inséré mon contrôle dans la méthode "AddedControl", ce qui permet le rendu des contrôle template.

En revanche, les évènement associés aux boutons du contrôle template ne se déclenchent pas, et c'est sur ce point que je coince completement :

Voici le code du mon contrôle (simplifié) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
    [ToolboxItem(false)]
    public class TemplateItem : Control, INamingContainer
    {
    }
 
 
    [ParseChildren(true)]
    public class userGridView : GridView
    {
        private ITemplate _multiSelectControlsTemplate = null;
        [Browsable(false), DefaultValue(null), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(TemplateItem))]
        public ITemplate MultiSelectControlsTemplate
        {
            get { return _multiSelectControlsTemplate; }
            set { _multiSelectControlsTemplate = value; }
        }
 
        public override ControlCollection Controls
        {
            get { EnsureChildControls(); return base.Controls; }
        }
 
 
 
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
 
            // plus rien, car ça marche pas
        }
 
 
        protected override void AddedControl(Control control, int index)
        {
            base.AddedControl(control, index);
            // insertion du template controle
            if (FindControl("_panel") == null)
            {
                // On crée un panel caché
                Panel panelCache = new Panel();
                panelCache.ID = "_panel";
                panelCache.Attributes["style"] = "display:none";
 
                //Ajout du template controle
                if (_multiSelectControlsTemplate != null)
                {
                    TemplateItem _multiSelect = new TemplateItem();
                    MultiSelectControlsTemplate.InstantiateIn(_multiSelect);
                    panelCache.Controls.Add(_multiSelect);
                }
                // Ajout du panel
                Controls.Add(panelCache);
            }
        }
 
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            /* ... */
            if (FooterRow != null)
            {
                /* ... */
                Panel tmp = (Panel) FindControl("_panel");
                if(tmp != null)
                    this.FooterRow.Cells[0].Controls.Add(tmp.Controls[0]);
            }
        }
    }

Et le code contenu dans le template du gridview personnalisé :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
<cc1:userGridView ID="GridView1" runat="server"
     AutoGenerateColumns="False" AllowPaging="True" 
     ShowFooter="True">
            <MultiSelectControlsTemplate>
                <asp:ImageButton ID="btSupprEns" runat="server" 
                        ImageUrl="~/Images/icons/cross.png"
                        OnClick="btSupprEns_Click"
                        CommandName="SupprEns"/>
            </MultiSelectControlsTemplate>
            <!-- ... -->
</cc1:userGridView>
Je ne sais pas si mon erreur concerne l'insertion du contrôle template dans le gridview ou si c'est la gestion du contrôle template en lui même qui est incomplete (genre viewstate ou autre).

Voilà, j'espère que vous aurez des propositions de solution à me donner