Skrevet ons. d. 11. april 2007 kl. 17:17:03| #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
Skrevet ons. d. 11. april 2007 kl. 17:25:43| #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?
Skrevet ons. d. 11. april 2007 kl. 20:46:58| #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
Skrevet tor. d. 12. april 2007 kl. 07:57:16| #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
Skrevet tor. d. 12. april 2007 kl. 10:49:32| #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
Skrevet tor. d. 12. april 2007 kl. 10:54:43| #6
Så det du vil anbefalde er at jeg laver min egen tekstboks kontrol hvor jeg selv tilføjer en RequiredFieldValidator ?
Skrevet tor. d. 12. april 2007 kl. 11:14:01| #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
Skrevet tor. d. 12. april 2007 kl. 11:28:17| #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
Skrevet tor. d. 12. april 2007 kl. 12:37:40| #9
Jeg sætter id'et på min tekstboks eksplicit:
tb.ID = "input";
Og benytter det navn til validatoren:
validator.ControlToValidate = "input";
Mvh
Skrevet tor. d. 12. april 2007 kl. 12:41:36| #10
okey, det gøre jeg så også i min hjemme lavet TextBoxRequiredFieldValidator kontrol
Skrevet tor. d. 12. april 2007 kl. 13:11:55| #11
Skrevet tor. d. 12. april 2007 kl. 13:35:23| #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);
}
}
Skrevet tor. d. 12. april 2007 kl. 13:43:31| #13
public TextBox TextBox
{
get
{
EnsureChildControls();
return textBox;
}
set { textBox = value; }
}
Ellers new den op hvor du deklererer den.
Mvh
Skrevet tor. d. 12. april 2007 kl. 13:47:38| #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
Skrevet tor. d. 12. april 2007 kl. 13:56:07| #15
Det gør du her:
this.Controls.Add(textBox);
Og på det tidspunkt skal den bare være instantieret.
Mvh
Skrevet tor. d. 12. april 2007 kl. 14:44:50| #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);
}
}
Skrevet tor. d. 12. april 2007 kl. 14:50:25| #17
Det skal nok lige tilføje at jeg ikke tilføjer mine kontroler i CreateChildControls mere men kun i min BuildRow metode
Skrevet man. d. 16. april 2007 kl. 17:26:21| #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
Skrevet man. d. 16. april 2007 kl. 17:44:19| #19
du får lige noget mere kode imorgen :)
Skrevet tir. d. 17. april 2007 kl. 11:55:17| #20
Det siger vi da bare :o)
Mvh
Skrevet ons. d. 18. april 2007 kl. 14:57:56| #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ø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?
Skrevet tir. d. 24. april 2007 kl. 09:54:38| #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
Skrevet tir. d. 24. april 2007 kl. 10:50:02| #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
Skrevet tir. d. 24. april 2007 kl. 10:55:23| #24
Skrevet søn. d. 01. juli 2007 kl. 08:58:46| #25
Hej ameq :o)
Jeg lægger et svar her hvis du vil lukke spørgsmålet.
Mvh
Skrevet søn. d. 01. juli 2007 kl. 13:57:15| #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 :)