Question

J'ai regardé autour sur le web et trouvé quelques articles sur le sujet, mais je ne peux toujours pas comprendre la différence entre eux. Je le spectacle de code ci-dessous, si je hérite d'un CompositeControl il fonctionne parfaitement, mais pas si je hérite d'un WebControl. (Ils rendent le code, mais seulement CompositeControl gère l'événement)

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestLibrary
{
    public class TemplateControl : CompositeControl
    {
        TextBox txtName = new TextBox();
        TextBox txtEmail = new TextBox();
        Button btnSend = new Button();

        private void SetValues()
        {
            btnSend.Text = "Skicka";
        }

        protected override void CreateChildControls()
        {
            SetValues();

            this.Controls.Add(new LiteralControl("Namn: "));
            this.Controls.Add(txtName);
            this.Controls.Add(new LiteralControl("<br />"));
            this.Controls.Add(new LiteralControl("Email: "));
            this.Controls.Add(txtEmail);
            this.Controls.Add(new LiteralControl("<br />"));
            btnSend.Command += new CommandEventHandler(btnSend_Command);
            this.Controls.Add(btnSend);
        }

        void btnSend_Command(object sender, CommandEventArgs e)
        {
            this.Page.Response.Write("Du har nu klickat på skicka-knappen! <br /><br />");                
        }
    }
}

Alors, quand je clique sur le bouton et le contrôle est rendu comme WebControl, rien ne se passe. Mais si je change le WebControl à un CompositeControl, le texte est imprimé. Pourquoi? Quelle est la différence entre le WebControl et CompositeControl?

Était-ce utile?

La solution

CompositeControls mettre en œuvre INamingContainer tout WebControls ne le font pas.

Il y a plus de différences entre les deux, mais c'est la raison pour laquelle le contrôle composite peut d'acheminer l'événement à son enfant, mais le contrôle Web ne peut pas. Vous pouvez voir cela en changeant votre déclaration de classe à ceci:

public class TemplateControl : WebControl, INamingContainer

Voila, votre événement de touche est désormais gérée!

INamingContainer est juste une interface marqueur qui raconte un contrôle ASP.NET contient les enfants qui peuvent avoir besoin d'accéder indépendamment de leur contrôle parent, si les contrôles enfants obtenir les développeurs ASP.NET nous ids supplémentaires jolies avons appris à connaître et à aimer (par exemple, ctl00$ctl00).

Si la WebControl ne met pas en œuvre INamingContainer, id de l'enfant n'est pas garanti d'être unique, de sorte que le parent ne peut pas identifier de manière fiable et ne peut transmettre des événements.

Autres conseils

Quelle est la différence entre UserControl, WebControl, RenderedControl et CompositeControl

Pourquoi un comportement différent de l'autre? Parce qu'ils sont différents types. Si elles étaient du même type il n'y aurait pas deux d'entre eux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top