Pergunta

I am badly stuck in middle of project with this issue. Googled a lot but not getting a solution.

My objective is to create a composite control with a label, textbox, two required field validator and a custom validator. My custom control code is as follows:-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AFGISServerControl
{
    [ToolboxData("<{0}:ValidatorTextBox runat="\""server\"> </{0}:ValidatorTextBox>")]
    public class ValidatorTextBox : CompositeControl
    {
        private TextBox InputTextBox;
        private Label InputLabel;
        private RequiredFieldValidator RequiredValidator1;
        private RequiredFieldValidator RequiredValidator2;
        private CustomValidator cv;
        private static readonly object EventValidateKey = new object();

        protected override void OnLoad(EventArgs e)
        {
            EnsureChildControls();
            base.OnLoad(e);
        }
        protected override void CreateChildControls()
        {
            Controls.Clear();
            InputTextBox = new TextBox();
            InputLabel = new Label();
            InputTextBox.ID = "inputTextBox";
            //InputTextBox.AutoPostBack = true;

            RequiredValidator1 = new RequiredFieldValidator();
            RequiredValidator1.ID = this.ID + "_RFV1";
            RequiredValidator1.ControlToValidate = InputTextBox.ID;
            RequiredValidator1.ValidationGroup = string.Empty;
            RequiredValidator1.Display = ValidatorDisplay.Dynamic;
            RequiredValidator1.ErrorMessage = Caption.ToString() + " is mandatory";

            RequiredValidator2 = new RequiredFieldValidator();
            RequiredValidator2.ID = this.ID + "_RFV2";
            RequiredValidator2.ControlToValidate = InputTextBox.ID;
            RequiredValidator2.Display = ValidatorDisplay.Dynamic;
            RequiredValidator2.ErrorMessage = Caption.ToString() + " is mandatory";

            cv = new CustomValidator();
            cv.ID = this.ID + "_CV";
            cv.ControlToValidate = InputTextBox.ID;
            cv.SetFocusOnError = true;
            cv.Display = ValidatorDisplay.Dynamic;
            cv.ErrorMessage = this.CustomErrorMessage;
            cv.ValidateEmptyText = true;
            cv.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.cv_ServerValidate);

            this.Controls.Add(InputLabel);
            this.Controls.Add(InputTextBox);
            this.Controls.Add(RequiredValidator1);
            this.Controls.Add(RequiredValidator2);
            this.Controls.Add(cv);
        }

        #region properties
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Value")
        ]
        public string Text
        {
            get
            {
                EnsureChildControls();
                return InputTextBox.Text;
            }
            set
            {
                EnsureChildControls();
                InputTextBox.Text = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Validation Group")
        ]
        public string ValidationGroup
        {
            get
            {
                EnsureChildControls();
                return InputTextBox.ValidationGroup;
            }
            set
            {
                EnsureChildControls();
                InputTextBox.ValidationGroup = value;
                RequiredValidator2.ValidationGroup = value;
                cv.ValidationGroup = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Error message for the custom validator.")
        ]
        public string CustomErrorMessage
        {
            get
            {
                EnsureChildControls();
                return cv.ErrorMessage;
            }
            set
            {
                EnsureChildControls();
                cv.ErrorMessage = value;
            }
        }
        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("Validity of custom validator.")
        ]
        public Boolean isValid
        {
            get
            {
                EnsureChildControls();
                return cv.IsValid;
            }
            set
            {
                EnsureChildControls();
                cv.IsValid = value;
            }
        }

        [
        Bindable(true),
        Category("Default"),
        DefaultValue(""),
        Description("The text for the name label.")
        ]
        public string Caption
        {
            get
            {
                EnsureChildControls();
                return InputLabel.Text;
            }
            set
            {
                EnsureChildControls();
                InputLabel.Text = value;
            }
        }
        #endregion

        protected override void RecreateChildControls()
        {
            EnsureChildControls();
        }

        [
        Category("Action"),
        Description("Raised on Text Change")
        ]
        public event ServerValidateEventHandler Validate
        {
            add
            {
                Events.AddHandler(EventValidateKey, value);
            }
            remove
            {
                Events.RemoveHandler(EventValidateKey, value);
            }
        }
        protected virtual void OnValidate(ServerValidateEventArgs args)
        {
            EventHandler ValidateHandler = (EventHandler)Events[EventValidateKey];
            if (ValidateHandler != null)
            {
                ValidateHandler(this, args);
            }
        }
        protected void cv_ServerValidate(object source, ServerValidateEventArgs args)
        {
            OnValidate(args);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            AddAttributesToRender(writer);
            InputLabel.RenderControl(writer);
            InputTextBox.RenderControl(writer);
            RequiredValidator1.RenderControl(writer);
            RequiredValidator2.RenderControl(writer);
            cv.RenderControl(writer);
        }        
    }
}

My aspx code is

    <cc1:ValidatorTextBox ID="ValidatorTextBox1" runat="server" Caption="Service No"
        CustomErrorMessage="Not Valid" ValidationGroup="test" 
        OnValidate="CVText" />
    <asp:Button ID="Button1" runat="server" Text="Button" />

aspx.cs

The specific issue faced are

  • Code behind method for "onvalidate" event is not being fired
  • Required field validator error message is displaying only "is mandatory", the caption is not prefixed.

I will be greatful for the advice.

Foi útil?

Solução 2

After breaking head, i changed the whole way of going about with this control. Went ahead with the useage of ivalidator. Thats quite an efficient way.

Outras dicas

A few things:

  • You need to call Page.Validate() or fire a postback with CausesValidation=true on the source control. Ensure you do not specify a ValidationGroup or use the "test" ValidationGroup when performing your validation.
  • Required field validator is being setup during CreateChildControls. Your Caption is pulling from input text, which is not filled until post init. It is possible your CreateChildControls is occurring before ViewState is loaded. You may want to either use JavaScript to set the RequiredFieldValidator text or use a _TextChanged event handler to update the error message whenever the text changes. The approach you take is obviously dependent upon your specific use case requriements.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top