Avatar billede ameq Nybegynder
11. april 2007 - 12:45 Der er 25 kommentarer og
1 løsning

RequiredFieldValidator kan vist ikke finde min control

Hej E

1) Jeg har en metode hvor jeg opbygget noget layout i en webpart.

2) Alle mine control (tekstbokse og knapper) tilføjer jeg i min CreateChildControls()

Men i den her metode hvor jeg opbygger mit layout i tilføjer jeg en RequiredFieldValidator til visse af mine kontroller.

RequiredFieldValidator requiredFieldValidator = new RequiredFieldValidator();
                requiredFieldValidator.ControlToValidate = TargetControl.UniqueID;
                requiredFieldValidator.ValidationGroup = "DebatValidationGroup";
                requiredFieldValidator.Display = ValidatorDisplay.Dynamic;
                requiredFieldValidator.ErrorMessage = "*";
                this.Controls.Add(requiredFieldValidator);
                rightLabel.Controls.Add(requiredFieldValidator);
Men når jeg kører min kode får jeg den her fejl:

System.Web.HttpException: Unable to find control id 'DebatFirstName' referenced by the 'ControlToValidate' property of ''. at System.Web.UI.WebControls.BaseValidator.CheckControlValidationProperty(String name, String propertyName) at System.Web.UI.WebControls.BaseValidator.ControlPropertiesValid() at System.Web.UI.WebControls.BaseValidator.OnPreRender(EventArgs e) at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Control.AddedControl(Control control, Int32 index) at System.Web.UI.ControlCollection.Add(Control child)

Det virker som om at min requiredFieldValidator ikke kan finde min tekstboks og jeg tror måske fordi at jeg tilføjer den i CreateChildControls().

En som har et bud på hvordan jeg retter den her fejl?
Avatar billede snepnet Nybegynder
11. april 2007 - 17:17 #1
Er din tekstboks (TargetControl) indsat i kontroltræet på det tidspunkt den kode du har vist bliver kørt?
(ellers prøv at sørg for at det er gjort).
Er det med vilje at du indsætter validatoren 2 gange?
Mvh
Avatar billede ameq Nybegynder
11. april 2007 - 17:25 #2
Min TargetControl skulle meget gerne være i træet, for den her metode bliver kaldt nede i Render metoden

this.Controls.Add(requiredFieldValidator);
rightLabel.Controls.Add(requiredFieldValidator);

Bliver begge tilføjet i kontrol træet der?
Avatar billede snepnet Nybegynder
11. april 2007 - 20:46 #3
Du tilføjer requiredFieldValidator til egen controlcollection OG til din rightLabel... Det ser underligt ud.
Kan du vise mig lidt kode der vedrører TargetControl?
Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 07:57 #4
protected override void CreateChildControls()
debatTitle = new TextBox();
debatTitle.ID = "DebatTitle";

debatText = new TextBox();
debatText.ID = "DebatText";
debatText.TextMode = TextBoxMode.MultiLine;

debatFirstName = new TextBox();
debatFirstName.ID = "DebatFirstName";

debatLastName = new TextBox();
debatLastName.ID = "DebatLastName";

buttonSaveComment = new Button();
buttonSaveComment.ID = "DebatSaveComment";
buttonSaveComment.Click += new EventHandler(DebatSaveCommentClick);
buttonSaveComment.Text = "Save and stuff";

this.Controls.Add(debatTitle);
this.Controls.Add(debatText);
this.Controls.Add(debatFirstName);
this.Controls.Add(debatLastName);
this.Controls.Add(buttonSaveComment);


protected override void Render(HtmlTextWriter writer)
BuildRow("First Name", debatFirstName, true);
o.s.v med de forskellige kontroller

private Panel BuildRow(string Text, WebControl TargetControl, bool AddValidator)
{
            Panel controlPanelWrapper = new Panel();
           
            Label leftLabel = new Label();
            leftLabel.CssClass = "LeftColm";
            leftLabel.Text = Text + " " + TargetControl.UniqueID;
            controlPanelWrapper.Controls.Add(leftLabel);

            Label rightLabel = new Label();
            rightLabel.CssClass = "RightColm";
            rightLabel.Controls.Add(TargetControl);
           
            if (AddValidator)
            {
                RequiredFieldValidator requiredFieldValidator = new RequiredFieldValidator();
                requiredFieldValidator.ControlToValidate = TargetControl.UniqueID;
                requiredFieldValidator.ValidationGroup = "DebatValidationGroup";
                requiredFieldValidator.Display = ValidatorDisplay.Dynamic;
                requiredFieldValidator.ErrorMessage = "*";
                this.Controls.Add(requiredFieldValidator);
                rightLabel.Controls.Add(requiredFieldValidator);
            }
            controlPanelWrapper.Controls.Add(rightLabel);

            return controlPanelWrapper;
        }

Det skulle vist være det
Avatar billede snepnet Nybegynder
12. april 2007 - 10:49 #5
Prøv ekplicit at giv tekstboksen et navn - og sørg for at din kontrol impementerer inamingcontainer (tomt interface).

Sådan noget her fungerer fint nok:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected override void OnInit(EventArgs e)
    {
        SomeControl c = new SomeControl();
        c.ButtonClick += c_ButtonClick;
        form1.Controls.Add(c);
        base.OnInit(e);
    }

    void c_ButtonClick(object sender, EventArgs e)
    {
        Response.Write("KLIK");
    }
}

public class SomeControl : Control, INamingContainer
{
    public event EventHandler ButtonClick;

    protected virtual void OnButtonClick(EventArgs e)
    {
        if (ButtonClick != null)
            ButtonClick(this, e);
    }

    protected override void CreateChildControls()
    {
        TextBox tb = new TextBox();
        tb.ID = "input";
        Controls.Add(tb);
       
        RequiredFieldValidator validator = new RequiredFieldValidator();
        validator.Text = "!!!";
        validator.ControlToValidate = "input";
        Controls.Add(validator);

        Button btn = new Button();
        btn.Text = "Klik her";
        btn.Click += btn_Click;
        Controls.Add(btn);
       
        base.CreateChildControls();
    }

    void btn_Click(object sender, EventArgs e)
    {
        OnButtonClick(EventArgs.Empty);
    }
}

Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 10:54 #6
Så det du vil anbefalde er at jeg laver min egen tekstboks kontrol hvor jeg selv tilføjer en RequiredFieldValidator ?
Avatar billede snepnet Nybegynder
12. april 2007 - 11:14 #7
Øh næh... Det var nu ikke pointen. Det var bare dem med at give den et id selv, og koden fik du bare så du havde noget der virkede, og som dynamisk indsatte en textbox og en validator til samme.
Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 11:28 #8
okey, så har jeg lidt svært ved at se forskellen på resultatet af din og min kode ud over ud at du bruger INamingContainer, men den kan jeg ikke huske om jeg har impementet
Avatar billede snepnet Nybegynder
12. april 2007 - 12:37 #9
Jeg sætter id'et på min tekstboks eksplicit:
tb.ID = "input";
Og benytter det navn til validatoren:
validator.ControlToValidate = "input";
Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 12:41 #10
okey, det gøre jeg så også i min hjemme lavet TextBoxRequiredFieldValidator kontrol
Avatar billede snepnet Nybegynder
12. april 2007 - 13:11 #11
Jep - prøv det.
Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 13:35 #12
Du må lige hjælp mig her
Jeg har fået lavet min kontrol men når jeg skal tilgå property på den f.eks. TextBox.TextMode så får jeg en fejl om at min tekstbok "TextBox" er null. Hvad gør jeg lige forkert her?

public class TextboxAndRequiredFieldValidator : WebControl, INamingContainer
    {
        private string errorMessage;

        public string ErrorMessage
        {
            get
            {
                if (string.IsNullOrEmpty(errorMessage))
                    return "Field can't be empty";
                else
                    return errorMessage;
            }
            set { errorMessage = value; }
        }

        private string validationGroup;

        public string ValidationGroup
        {
            get
            {
                if (string.IsNullOrEmpty(validationGroup))
                    return "DefaultValidationGroup";
                else
                    return validationGroup;
            }
            set { validationGroup = value; }
        }


        private TextBox textBox;

        public TextBox TextBox
        {
            get { return textBox; }
            set { textBox = value; }
        }
        private RequiredFieldValidator requiredFieldValidator;

        public RequiredFieldValidator RequiredFieldValidator
        {
            get { return requiredFieldValidator; }
            set { requiredFieldValidator = value; }
        }

        public TextboxAndRequiredFieldValidator()
        {
            this.EnsureChildControls();
        }

        protected override void OnInit(EventArgs e)
        {
            this.EnsureChildControls();
            base.OnInit(e);
        }
        protected override void CreateChildControls()
        {
            requiredFieldValidator = new RequiredFieldValidator();
            requiredFieldValidator.ID = "RequiredFieldValidator";
            requiredFieldValidator.Display = ValidatorDisplay.Dynamic;
            requiredFieldValidator.ErrorMessage = this.ErrorMessage;
            requiredFieldValidator.ControlToValidate = "TextBox";
            requiredFieldValidator.ValidationGroup = this.ValidationGroup;
            this.Controls.Add(requiredFieldValidator);

            textBox = new TextBox();
            textBox.ID = "TextBox";
            this.Controls.Add(textBox);
            base.OnInit(e);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            textBox.RenderControl(writer);
            RequiredFieldValidator.RenderControl(writer);
            base.Render(writer);
        }
    }
Avatar billede snepnet Nybegynder
12. april 2007 - 13:43 #13
public TextBox TextBox
{
  get
  {
    EnsureChildControls();
    return textBox;
  }
  set { textBox = value; }
}

Ellers new den op hvor du deklererer den.

Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 13:47 #14
Ellers new den op hvor du deklererer den. <- ja men jeg ville jo også godt havde at at den bliver tilføjet til kontrol træet
Avatar billede snepnet Nybegynder
12. april 2007 - 13:56 #15
Det gør du her:
this.Controls.Add(textBox);
Og på det tidspunkt skal den bare være instantieret.
Mvh
Avatar billede ameq Nybegynder
12. april 2007 - 14:44 #16
Underligt, nu har jeg tilføjet nolge flere af TextboxAndRequiredFieldValidator  og nu virker det som om at de checker for noget forkert...

Når jeg loader siden først gang kommer fejl beskeden frem med det samme og selv om jeg skriver noget i boksene og af-foruser tekstboxen står fejlen der stadig :S why?

public class TextboxAndRequiredFieldValidator : WebControl, INamingContainer
    {
        private string errorMessage;

        public string ErrorMessage
        {
            get
            {
                if (string.IsNullOrEmpty(errorMessage))
                    return "Field can't be empty";
                else
                    return errorMessage;
            }
            set { errorMessage = value; }
        }

        private string validationGroup;

        public string ValidationGroup
        {
            get
            {
                if (string.IsNullOrEmpty(validationGroup))
                    return "DefaultValidationGroup";
                else
                    return validationGroup;
            }
            set { validationGroup = value; }
        }


        private TextBox textBox;

        public TextBox TextBox
        {
            get {
                this.EnsureChildControls();
                return textBox;
            }
            set { textBox = value; }
        }
        private RequiredFieldValidator requiredFieldValidator;

        public RequiredFieldValidator RequiredFieldValidator
        {
            get { return requiredFieldValidator; }
            set { requiredFieldValidator = value; }
        }

        public TextboxAndRequiredFieldValidator()
        {
            this.EnsureChildControls();
        }

        protected override void OnInit(EventArgs e)
        {
            this.EnsureChildControls();
            base.OnInit(e);
        }
        protected override void CreateChildControls()
        {
            if (!ChildControlsCreated)
            {
                requiredFieldValidator = new RequiredFieldValidator();
                requiredFieldValidator.ID = this.UniqueID + "RequiredFieldValidator";
                requiredFieldValidator.Display = ValidatorDisplay.Dynamic;
                requiredFieldValidator.ErrorMessage = this.ErrorMessage;
                requiredFieldValidator.ControlToValidate = "TextBox";
                requiredFieldValidator.ValidationGroup = this.ValidationGroup;
                this.Controls.Add(requiredFieldValidator);

                textBox = new TextBox();
                textBox.ID = "TextBox";
                this.Controls.Add(textBox);

                ChildControlsCreated = true;
            }
           
          }
        protected override void Render(HtmlTextWriter writer)
        {
            textBox.RenderControl(writer);
            RequiredFieldValidator.RenderControl(writer);
        }
    }
Avatar billede ameq Nybegynder
12. april 2007 - 14:50 #17
Det skal nok lige tilføje at jeg ikke tilføjer mine kontroler i CreateChildControls mere men kun i min BuildRow metode
Avatar billede snepnet Nybegynder
16. april 2007 - 17:26 #18
Jeg er ikke helt sikker på hvad det er du skriver, og jeg kan heller ikke genskabe problemet her (jeg undlader dog at angive en validationgroup).

Har du mulighed for at give mig lidt mere at arbejde med?
(eventuelt skrive hvordan du indsætter knapper på siden og angiver validatiogroup på dem)

Mvh
Avatar billede ameq Nybegynder
16. april 2007 - 17:44 #19
du får lige noget mere kode imorgen :)
Avatar billede snepnet Nybegynder
17. april 2007 - 11:55 #20
Det siger vi da bare :o)
Mvh
Avatar billede ameq Nybegynder
18. april 2007 - 14:57 #21
Min OnInit Metode:
protected override void OnInit(EventArgs e)
        {
            try
            {
                debatTitle = new TextboxAndRequiredFieldValidator();
                debatTitle.ID = "DebatTitle";

                debatText = new TextboxAndRequiredFieldValidator();
                debatText.ID = "DebatText";
                debatText.TextBox.TextMode = TextBoxMode.MultiLine;

                debatFirstName = new TextboxAndRequiredFieldValidator();
                debatFirstName.ID = "DebatFirstName";

                debatLastName = new TextboxAndRequiredFieldValidator();
                debatLastName.ID = "DebatLastName";

                if (this.Context.User.Identity.IsAuthenticated && this.Page != null)
                {
                    using (SPSite site = new SPSite(this.Page.Request.Url.ToString()))
                    {
                        using (SPWeb web = site.RootWeb)
                        {
                            ServerContext serverCotext = ServerContext.GetContext(site);
                            UserProfileManager userProfileManager = new UserProfileManager(serverCotext);
                            UserProfile userProfile = userProfileManager.GetUserProfile(this.Context.User.Identity.Name);
                           
                            if(userProfile[PropertyConstants.FirstName].Count != 0)
                                debatFirstName.TextBox.Text = userProfile[PropertyConstants.FirstName].ToString();

                            if (userProfile[PropertyConstants.LastName].Count != 0)
                                debatLastName.TextBox.Text = userProfile[PropertyConstants.LastName].ToString();
                        }
                    }
                }

                hyperLink = new HyperLink();
                string parentDebatID = string.Empty;

                if (!string.IsNullOrEmpty(this.Context.Request.QueryString["ParentDebatID"]))
                    parentDebatID = string.Format("DebatID={0}", this.Context.Request.QueryString["ParentDebatID"]);

                hyperLink.Text = "Tilbage til debatten";
                if (this.singleThread)
                    hyperLink.NavigateUrl = string.Format("{0}", this.Context.Request.Path);
                else
                    hyperLink.NavigateUrl = string.Format("{0}?DebatView=List&{1}", this.Context.Request.Path, parentDebatID);

                buttonSaveComment = new Button();
                buttonSaveComment.ID = "DebatSaveComment";
                buttonSaveComment.Click += new EventHandler(DebatSaveCommentClick);
                buttonSaveComment.Text = "Save and stuff";

                //this.Controls.Add(debatTitle);
                //this.Controls.Add(debatText);
                //this.Controls.Add(debatFirstName);
                //this.Controls.Add(debatLastName);
                this.Controls.Add(hyperLink);
                //this.Controls.Add(buttonSaveComment);
               
            }
            catch (Exception ex)
            {
                errorMessage = ex.ToString();
                errorOccured = true;
            }
        }
Min Render Metode:
protected override void Render(HtmlTextWriter writer)
        {
            try
            {
                this.EnsureChildControls();
                if (!string.IsNullOrEmpty(DebatGUID))
                {
                    if (string.IsNullOrEmpty(this.Context.Request.QueryString["DebatID"]) || DebatRenderMode == DebatRenderMode.ViewList)
                    {
                   
                        using (SPSite site = new SPSite(this.Context.Request.Url.ToString()))
                        {
                            using (SPWeb web = site.RootWeb)
                            {
                                GetDebatItems(web.Lists["DebatItems"], this.DebatGUID);
                            }
                        }

                        writer.Write("<h1>{0}</h1>", GetDebatHeadline(this.DebatGUID));
                        writer.Write("<ul>");
                        writer.Write(debatOutput.ToString());
                        writer.Write("</ul>");
                        writer.Write("<div><a href=\"?DebatID={0}&ParentDebatID={0}\">Tilf&oslash;j Kommenter<a></div>", this.DebatGUID);
                    }
                    else
                    {
                        Label debatCommentarWrapper = new Label();
                        debatCommentarWrapper.CssClass = "DebatCommentWrapper";

                        ////Firstname
                        //Panel firstNamePanel = BuildRow("First Name", debatFirstName);
                        //debatCommentarWrapper.Controls.Add(firstNamePanel);
                        this.Controls.Add(debatFirstName);
                        debatFirstName.RenderControl(writer);
                        ////Last name
                        //Panel lastNamePanel = BuildRow("Last Name", debatLastName);
                        //debatCommentarWrapper.Controls.Add(lastNamePanel);

                        ////Debat Title
                        //Panel titlePanel = BuildRow("Title", debatTitle);
                        //debatCommentarWrapper.Controls.Add(titlePanel);

                        ////Debat text
                        //Panel textPanel = BuildRow("Text", debatText);
                        //debatCommentarWrapper.Controls.Add(textPanel);
                       
                        ////Save button
                        //Panel saveButtonPanel = BuildRow("", buttonSaveComment);
                        //debatCommentarWrapper.Controls.Add(saveButtonPanel);
                        this.Controls.Add(buttonSaveComment);
                        buttonSaveComment.RenderControl(writer);
                        ////Render alle kontroler ud
                        //debatCommentarWrapper.RenderControl(writer);

                        //E.g. Tilbage link
                        hyperLink.RenderControl(writer);

                        //E.g. Din kommentar er blevet tilføjet
                        devatCommentReturnMessage.RenderControl(writer);

                        SPListItem debatItem = GetDebatItem(this.Context.Request.QueryString["DebatID"]);
                        if (debatItem != null)
                        {
                            debatCommentText.Text = string.Format("<div class=\"DebatCommentTextWrapper\"><div><h1>{0}</h1></div><div>{1}</div></div>", debatItem["Title"], debatItem["Text"]);
                            debatCommentText.RenderControl(writer);
                        }
                    }
                }
               
               
            }
            catch (Exception ex)
            {
                errorMessage = ex.ToString();
                errorOccured = true;
            }
            if (errorOccured)
                writer.Write(errorMessage);

        }

Min TextboxAndRequiredFieldValidator klasse
public class TextboxAndRequiredFieldValidator : WebControl, INamingContainer
    {
        private string errorMessage;

        public string ErrorMessage
        {
            get
            {
                if (string.IsNullOrEmpty(errorMessage))
                    return "Field can't be empty";
                else
                    return errorMessage;
            }
            set { errorMessage = value; }
        }

        private string validationGroup;

        public string ValidationGroup
        {
            get
            {
                if (string.IsNullOrEmpty(validationGroup))
                    return "DefaultValidationGroup";
                else
                    return validationGroup;
            }
            set { validationGroup = value; }
        }


        private TextBox textBox;

        public TextBox TextBox
        {
            get {
                this.EnsureChildControls();
                return textBox;
            }
            set { textBox = value; }
        }
        private RequiredFieldValidator requiredFieldValidator;

        public RequiredFieldValidator RequiredFieldValidator
        {
            get { return requiredFieldValidator; }
            set { requiredFieldValidator = value; }
        }

        public TextboxAndRequiredFieldValidator()
        {
            this.EnsureChildControls();
        }

        protected override void OnInit(EventArgs e)
        {
            this.EnsureChildControls();
            base.OnInit(e);
        }
        protected override void CreateChildControls()
        {
            if (!ChildControlsCreated)
            {
                requiredFieldValidator = new RequiredFieldValidator();
                requiredFieldValidator.ID = this.UniqueID + "RequiredFieldValidator";
                requiredFieldValidator.Display = ValidatorDisplay.Dynamic;
                requiredFieldValidator.ErrorMessage = this.ErrorMessage;
                requiredFieldValidator.ControlToValidate = "TextBox";
                requiredFieldValidator.ValidationGroup = this.ValidationGroup;
                this.Controls.Add(requiredFieldValidator);

                textBox = new TextBox();
                textBox.ID = "TextBox";
                this.Controls.Add(textBox);

                ChildControlsCreated = true;
            }
           
          }
        protected override void Render(HtmlTextWriter writer)
        {
            textBox.RenderControl(writer);
            RequiredFieldValidator.RenderControl(writer);
        }
    }

Er det nok?
Avatar billede ameq Nybegynder
24. april 2007 - 09:54 #22
Jeg har sidet og leget lidt med det og i min Render metode skriver jeg

debatFirstName = new TextboxAndRequiredFieldValidator();
                        debatFirstName.ID = "DebatFirstName";
                        debatFirstName.RequiredFieldValidator.ValidationGroup = "DefaultValidationGroup";
                        this.Controls.Add(debatFirstName);
                        debatFirstName.RenderControl(writer);

                        buttonSaveComment = new Button();
                        buttonSaveComment.ID = "DebatSaveComment";
                        buttonSaveComment.Click += new EventHandler(DebatSaveCommentClick);
                        buttonSaveComment.Text = "Save and stuff";
                        buttonSaveComment.ValidationGroup = "DefaultValidationGroup";
                        this.Controls.Add(buttonSaveComment);
                        buttonSaveComment.RenderControl(writer);

Kan jeg gøre det på den måde? eller skal jeg tilføje min kontroller et andet sted?

min knaps event kaster en Exception men den kommer ikke frem når jeg trykker på knappen
Avatar billede snepnet Nybegynder
24. april 2007 - 10:50 #23
Det vil ikke være normal fremgangsmåde at lægge kontroller i kontroltræet i render - CreateChildControls bør være initiater for den slags.
Prøv at tilføj den til kontroltræet der, og husk at sikre at du har INamingContainer på klassen (ellers vil det ikke virke).
Mvh
Avatar billede ameq Nybegynder
24. april 2007 - 10:55 #24
okey prøver lige det
Avatar billede snepnet Nybegynder
01. juli 2007 - 08:58 #25
Hej ameq :o)
Jeg lægger et svar her hvis du vil lukke spørgsmålet.
Mvh
Avatar billede ameq Nybegynder
01. juli 2007 - 13:57 #26
Jo tak og tak for hjælp. Sorry jeg ikke har svaret, fundt også min fejl.
Jeg skal havde tilføjet min tekstboks inden jeg tilføjer min vaild. kontrol.
Offtopic
Tak for geek dinner :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester