11. april 2007 - 12:45Der 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?
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
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
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); }
Ø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
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
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(); }
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(); }
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);
using (SPSite site = new SPSite(this.Context.Request.Url.ToString())) { using (SPWeb web = site.RootWeb) { GetDebatItems(web.Lists["DebatItems"], this.DebatGUID); } }
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(); }
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
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 :)
Synes godt om
Ny brugerNybegynder
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.