IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#2] Problème de CustomControl


Sujet :

ASP.NET

  1. #1
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut [C#2] Problème de CustomControl
    Salut à tous,

    Je bloque sur un PB qui me rend fou !!
    Je créé un CustomControl qui doit hérité de TextBox et et implémenter l'interface IValidator.
    Ce controle contient un CustomValidator en interne (private) et quelques propriétés plublic pour paramétrer ce validator.
    Mon problème se situe au niveau de la validation serveur. En effet, celle-ci ne semble jamais avoir lieu !! je ne passe pas dans les méthodes créées pour la gestion de l'événément ServerValidate.
    Pourtant, la validation client se fait correctement.

    Juste une précision avant de vous montrer mon code. Je créé un 1er controle (MyTextBox) tout simple (aucune validation). Puis plusieurs autres contrôles qui héritent de MyTextBox, chacun spécialisé (MyIntergerTextBox, MyDecimalTextBox, ...). Ensuite, j'ai une autre couche de contrôles qui héritent d'un des contrôles précédent pour le spécialiser encore un peu plus (MyIntegerTextBox2 : MyIntegerTextBox, .....)

    Voici en gros le code de ma classe MyTextBox :
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    	public class MyTextBox : TextBox, IValidator
    	{
    		private bool _enableClientScript = true;
    		private string _errorMessage;
    		private string _validatorText;
    		private string _validationFunction;
    		private CustomValidator _validator;
     
    		public event ServerValidateEventHandler ServerValidate;
     
    		public bool EnableClientScript
    		{
    			get { return _enableClientScript; }
    			set { _enableClientScript = value; }
    		}
     
    		public string ValidatorText
    		{
    			get { return _validatorText; }
    			set { _validatorText = value; }
    		}
     
    		protected string ClientValidationFunction
    		{
    			get { return _validationFunction; }
    			set { _validationFunction = value; }
    		}
     
    		public string ErrorMessage
    		{
    			get { return _errorMessage; }
    			set { _errorMessage = value; }
    		}
     
    		public bool IsValid
    		{
    			get { return _validator.IsValid; }
    			set { _validator.IsValid = value; }
    		}
     
    		public virtual void Validate()
    		{
    			_validator.Validate();
    		}
     
    		public virtual void OnServerValidate(ServerValidateEventArgs args)
    		{
    			if (ServerValidate != null)
    				ServerValidate(this, args);
    		}
     
    		public CNPTextBox() : base()
    		{
    			_validator = new CustomValidator();
    		}
     
    		protected override void CreateChildControls()
    		{
    			_validator.ServerValidate += new ServerValidateEventHandler(_validator_ServerValidate);
    			_validator.ID = this.ID + "_validator";
    			_validator.ControlToValidate = this.ID;
    			_validator.ErrorMessage = ErrorMessage;
    			_validator.EnableClientScript = EnableClientScript;
    			_validator.ValidationGroup = ValidationGroup;
    			_validator.Text = ValidatorText;
    			_validator.ClientValidationFunction = ClientValidationFunction;
     
    			this.Controls.Add(_validator);
    			base.CreateChildControls();
    		}
     
    		void _validator_ServerValidate(object source, ServerValidateEventArgs args)
    		{
    			OnServerValidate(args);
    		}
     
    		protected override void OnPreRender(EventArgs e)
    		{
    			ClientScriptManager cs = Page.ClientScript;
    			cs.RegisterClientScriptResource(typeof(MyTextBox), "MyTextBox.js");
    			base.OnPreRender(e);
    		}
     
    		protected override void Render(HtmlTextWriter writer)
    		{
    			base.Render(writer);
    			_validator.RenderControl(writer);
    		}
    	}
    Puis le code d'une classe spécialisée (MyDecimalTextBox) :
    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
     
    	public class MyDecimalTextBox : MyTextBox
    	{
    		public MyDecimalTextBox () : base()
    		{
    			//base.ServerValidate += new ServerValidateEventHandler(MyDecimalTextBox_ServerValidate);
    		}
     
    		public override void OnServerValidate(ServerValidateEventArgs args)
    		{
    			base.OnServerValidate(args);
     
    			double dt;
    			string strDouble = args.Value.Replace(",", ".");
    			strDouble = strDouble.Replace(" ", "");
    			bool ret = false;
     
    			if (Double.TryParse(strDouble, out dt))
    			{
    				ret = true;
    				this.Text = dt.ToString("n2");
    			}
     
    			args.IsValid = ret;
    		}
     
    		//void MyDecimalTextBox_ServerValidate(object source, ServerValidateEventArgs args)
    		//{
    		//   double dt;
    		//   string strDouble = args.Value.Replace(",", ".");
    		//   strDouble = strDouble.Replace(" ", "");
    		//   bool ret = false;
     
    		//   if (Double.TryParse(strDouble, out dt))
    		//   {
    		//      ret = true;
    		//      this.Text = dt.ToString("n2");
    		//   }
     
    		//   args.IsValid = ret;
    		//}
     
     
    		protected override void OnInit(EventArgs e)
    		{
    			base.ClientValidationFunction = "CheckDouble";
    			base.OnInit(e);
    		}
     
    		public override void RenderBeginTag(HtmlTextWriter writer)
    		{
    			writer.AddAttribute("onfocus", "this.value = MoneyUnformat(this.value)");
    			base.RenderBeginTag(writer);
    		}
    	}
    Remarque : En commentaire dans la classe ci-dessus, une autre "méthode" pour la validation server, mais elle ne marche pas mieux

    Le code de la classe encore au-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public class MyDecimalTextBox2 : MyDecimalTextBox
    	{
    		public MyDecimalTextBox2() : base()
    		{
    			ValidatorText = "*";
    		}
    	}
    Enfin me code de l'aspx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <pum:MyDecimalTextBox2 ID="MyDecimalTextBox2_1" runat="server" ErrorMessage="Format incorrect"></pum:MyDecimalTextBox2>
    Je précise qu'en activant la validation client (par défaut), pas de PB.
    Mais il n'y a pas de validation serveur. Et ce même si je désactive la validation client.

    Qu'est-ce qu'il me manque ???

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Bon ben plus la peine de chercher, j'ai trouvé le PB.
    Le problème était sur la méthode CreateChildControls()

    J'ai mis le code de CreateChildControls dans Init, et tout fonctionne correctement maintenant.
    Je comprends pas pourquoi (cette méthode n'est-elle pas là pour ça ?), mais bon, tant pis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de visibilité d'un CustomControl dans le designer?
    Par bakonu dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 11/02/2015, 17h25
  2. [VB.NET] Problème de position d'un customcontrol
    Par AP dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/04/2006, 20h40
  3. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo