[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

David

10/29/2006 10:28:00 AM

Hi all,

I am not quite sure how to phrase the subject, so apologies.

I am writing a custom control. It is using a textbox. I create the text box,
but cannot read the contents of it later.

Here is my code...

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;

namespace MyProjectControls
{
/// <summary>
/// Summary description for WebCustomControl1.
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:WebCustomControl1
runat=server></{0}:WebCustomControl1>")]
public class HTMLPlaceHolder : System.Web.UI.WebControls.WebControl
{

private System.Web.UI.WebControls.TextBox tb = new TextBox();


private string text;
private string _CurrentViewMode = "display";

[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
{
get
{
return text;
}

set
{
text = value;
}
}

public string CurrentViewMode
{
get
{
return _CurrentViewMode.ToLower();
}

set
{
_CurrentViewMode = value.ToLower();
}
}

/// <summary>
/// Render this control to the output parameter specified.
/// </summary>
/// <param name="output"> The HTML writer to write out to </param>
protected override void Render(HtmlTextWriter output)
{

RenderContents(output);

}


protected override void OnPreRender(EventArgs e)
{
System.Web.UI.Page MyPage = this.Page as System.Web.UI.Page;

CurrentViewMode = MyPage.PageState;

Text = "This is purely test text"

if (MyPage.AllowSave)
{
SavePlaceholder();
}

switch (CurrentViewMode)
{
case "edit" :
AuthoringPlaceholder();
break;
case "display" :
DisplayPlaceholder();
break;
case "design" :
DesignPlaceholder();
break;
default:
DisplayPlaceholder();
break;
}


base.OnPreRender (e);
}

protected void DesignPlaceholder()
{
}

protected void AuthoringPlaceholder()
{
//TextBox tb = new TextBox();

//this.tb = new TextBox();
this.tb.ID = this.ID;
this.tb.TextMode = TextBoxMode.MultiLine;
this.tb.Text = Text;
this.tb.Columns = 40;
this.tb.Rows = 15;

Controls.Add(this.tb);

}

protected void DisplayPlaceholder()
{
LiteralControl lit = new LiteralControl("<div>" + Text + "</div>");
Controls.Add(lit);
}

protected void SavePlaceholder()
{
System.Web.HttpContext.Current.Response.Write(this.tb.Text);
}

}
}


In the SavePlaceHolder, I want to be able to display what is written in the
text box. (Actually, I want to save it, but to display it will show that
something is happening).

However, this.tb.Text has nothing in it in the SavePlaceholder.

How can I ensure that what is coming back when the page is submitted is
actually there?

Thanks.

Best regards,
Dave Colliver.
http://www.Ashfiel...
~~
http://www.FOCUSP... - Local franchises available


6 Answers

tdotnet

10/29/2006 5:03:00 PM

0

It's been a while since I've done one of these, but glancing through
the code, I could be just missing it, but I could not find where your
Text property sets the .Text property of the TextBox. And where or how
do you restore the value to your text field string on a postback?

-Tyler
http://www.ne... - The .NET Developer Search Engine

David wrote:
> Hi all,
>
> I am not quite sure how to phrase the subject, so apologies.
>
> I am writing a custom control. It is using a textbox. I create the text box,
> but cannot read the contents of it later.
>
> Here is my code...
>
> using System;
> using System.Web.UI;
> using System.Web.UI.WebControls;
> using System.ComponentModel;
> using System.Drawing;
>
> namespace MyProjectControls
> {
> /// <summary>
> /// Summary description for WebCustomControl1.
> /// </summary>
> [DefaultProperty("Text"),
> ToolboxData("<{0}:WebCustomControl1
> runat=server></{0}:WebCustomControl1>")]
> public class HTMLPlaceHolder : System.Web.UI.WebControls.WebControl
> {
>
> private System.Web.UI.WebControls.TextBox tb = new TextBox();
>
>
> private string text;
> private string _CurrentViewMode = "display";
>
> [Bindable(true),
> Category("Appearance"),
> DefaultValue("")]
> public string Text
> {
> get
> {
> return text;
> }
>
> set
> {
> text = value;
> }
> }
>
> public string CurrentViewMode
> {
> get
> {
> return _CurrentViewMode.ToLower();
> }
>
> set
> {
> _CurrentViewMode = value.ToLower();
> }
> }
>
> /// <summary>
> /// Render this control to the output parameter specified.
> /// </summary>
> /// <param name="output"> The HTML writer to write out to </param>
> protected override void Render(HtmlTextWriter output)
> {
>
> RenderContents(output);
>
> }
>
>
> protected override void OnPreRender(EventArgs e)
> {
> System.Web.UI.Page MyPage = this.Page as System.Web.UI.Page;
>
> CurrentViewMode = MyPage.PageState;
>
> Text = "This is purely test text"
>
> if (MyPage.AllowSave)
> {
> SavePlaceholder();
> }
>
> switch (CurrentViewMode)
> {
> case "edit" :
> AuthoringPlaceholder();
> break;
> case "display" :
> DisplayPlaceholder();
> break;
> case "design" :
> DesignPlaceholder();
> break;
> default:
> DisplayPlaceholder();
> break;
> }
>
>
> base.OnPreRender (e);
> }
>
> protected void DesignPlaceholder()
> {
> }
>
> protected void AuthoringPlaceholder()
> {
> //TextBox tb = new TextBox();
>
> //this.tb = new TextBox();
> this.tb.ID = this.ID;
> this.tb.TextMode = TextBoxMode.MultiLine;
> this.tb.Text = Text;
> this.tb.Columns = 40;
> this.tb.Rows = 15;
>
> Controls.Add(this.tb);
>
> }
>
> protected void DisplayPlaceholder()
> {
> LiteralControl lit = new LiteralControl("<div>" + Text + "</div>");
> Controls.Add(lit);
> }
>
> protected void SavePlaceholder()
> {
> System.Web.HttpContext.Current.Response.Write(this.tb.Text);
> }
>
> }
> }
>
>
> In the SavePlaceHolder, I want to be able to display what is written in the
> text box. (Actually, I want to save it, but to display it will show that
> something is happening).
>
> However, this.tb.Text has nothing in it in the SavePlaceholder.
>
> How can I ensure that what is coming back when the page is submitted is
> actually there?
>
> Thanks.
>
> Best regards,
> Dave Colliver.
> http://www.Ashfiel...
> ~~
> http://www.FOCUSP... - Local franchises available

Michael Hamrah

10/29/2006 6:39:00 PM

0

I think the problem you have is that you're not loading the contents of
the control tree properly. I don't think .NET can find the Textbox
control when a Postback happens so it can't properly set the textbox
text property. This is because you're only adding the textbox in the
PreRender event if the user is in edit mode.

You want to sure ensure that all controls sent to the client are loaded
again in the init event during a postback. THis allow .NET to properly
map form objects to .NET controls. You can try either 1) Always
loading the textbox but setting the visible property to true or false,
2) Add a marker that will tell the control to load the Textbox in the
Init event if it was sent out during the Init event. 3) Explicitly
setting the text property of the Textbox by implementing the
IPostBackDataHandler interface.

David

10/29/2006 7:15:00 PM

0

Hi,

Thank you both (tdotnet and Michael), however I am still having problems...
It may be a combination of both answers.

I have written an OnInit

protected override void OnInit(EventArgs e)
{
//tb.ID = this.ID;
tb.TextMode = TextBoxMode.MultiLine;
//this.tb.Text = Text;
tb.Columns = 40;
tb.Rows = 15;

Controls.Add(tb);
base.OnInit (e);
}

(Note, the Text property has been remarked, as that can only really be
loaded in the OnPreRender).

This seems to prepare the textbox but on the postback, when I am trying to
read it, there is nothing. How do I ensure that there is text in the
postback?

(I pre-load the text box in pre-render, I wish to be able to change the
contents and I want to see what is in the text boxes when it comes back)

I have never used the IPostBackDataHandler. Given what I have written above,
does it look like this is what I need? If so, can you show me an example?

Thanks.

Best regards,
Dave Colliver.
http://www.Ashfiel...
~~
http://www.FOCUSP... - Local franchises available


"Michael Hamrah" <mhamrah@gmail.com> wrote in message
news:1162147119.046631.68450@k70g2000cwa.googlegroups.com...
>I think the problem you have is that you're not loading the contents of
> the control tree properly. I don't think .NET can find the Textbox
> control when a Postback happens so it can't properly set the textbox
> text property. This is because you're only adding the textbox in the
> PreRender event if the user is in edit mode.
>
> You want to sure ensure that all controls sent to the client are loaded
> again in the init event during a postback. THis allow .NET to properly
> map form objects to .NET controls. You can try either 1) Always
> loading the textbox but setting the visible property to true or false,
> 2) Add a marker that will tell the control to load the Textbox in the
> Init event if it was sent out during the Init event. 3) Explicitly
> setting the text property of the Textbox by implementing the
> IPostBackDataHandler interface.
>


David

10/29/2006 9:10:00 PM

0

Hi,

Sorted it. A combination of OnInit and IPostBackDataHandler (which gave me a
few headaches to make work...).

It seems that IPostBackDataHandler needs to return a boolean value. What is
this for?

Best regards,
Dave Colliver.
http://www.Sheffiel...
~~
http://www.FOCUSP... - Local franchises available


"David" <david.colliver.NEWS@revilloc.REMOVETHIS.com> wrote in message
news:%23JIFN64%23GHA.1220@TK2MSFTNGP05.phx.gbl...
> Hi,
>
> Thank you both (tdotnet and Michael), however I am still having
> problems... It may be a combination of both answers.
>
> I have written an OnInit
>
> protected override void OnInit(EventArgs e)
> {
> //tb.ID = this.ID;
> tb.TextMode = TextBoxMode.MultiLine;
> //this.tb.Text = Text;
> tb.Columns = 40;
> tb.Rows = 15;
>
> Controls.Add(tb);
> base.OnInit (e);
> }
>
> (Note, the Text property has been remarked, as that can only really be
> loaded in the OnPreRender).
>
> This seems to prepare the textbox but on the postback, when I am trying to
> read it, there is nothing. How do I ensure that there is text in the
> postback?
>
> (I pre-load the text box in pre-render, I wish to be able to change the
> contents and I want to see what is in the text boxes when it comes back)
>
> I have never used the IPostBackDataHandler. Given what I have written
> above, does it look like this is what I need? If so, can you show me an
> example?
>
> Thanks.
>
> Best regards,
> Dave Colliver.
> http://www.Ashfiel...
> ~~
> http://www.FOCUSP... - Local franchises available
>
>
> "Michael Hamrah" <mhamrah@gmail.com> wrote in message
> news:1162147119.046631.68450@k70g2000cwa.googlegroups.com...
>>I think the problem you have is that you're not loading the contents of
>> the control tree properly. I don't think .NET can find the Textbox
>> control when a Postback happens so it can't properly set the textbox
>> text property. This is because you're only adding the textbox in the
>> PreRender event if the user is in edit mode.
>>
>> You want to sure ensure that all controls sent to the client are loaded
>> again in the init event during a postback. THis allow .NET to properly
>> map form objects to .NET controls. You can try either 1) Always
>> loading the textbox but setting the visible property to true or false,
>> 2) Add a marker that will tell the control to load the Textbox in the
>> Init event if it was sent out during the Init event. 3) Explicitly
>> setting the text property of the Textbox by implementing the
>> IPostBackDataHandler interface.
>>
>
>


Michael Hamrah

10/30/2006 4:15:00 PM

0

The IPostBackDataHandler returns a boolean value if the data has
changed in the control. THis is so it can raise a data changed event.

I wrote the following code below which doesn't use the
IPostBackDataHandler (it relies on the textbox data handler, but it may
not fit your needs in the long run.

Anyway, the trick is to leverage the CreateChildControls function.
This function gets called anytime .NET needs the control to be in a
valid state- essentially during a postback after the init event and
before it gets rendered.

public class HTMLPlaceholder : CompositeControl
{
private TextBox tb = new TextBox();

private string _text;
private string _viewMode;

public string ViewMode
{
get { return (ViewState["ViewMode"] == null) ? "default" :
ViewState["ViewMode"].ToString(); }
set { ViewState["ViewMode"] = value; }
}
public string Text
{
get { return _text; }
set { _text = value; }
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
protected override void OnLoad(EventArgs e)
{
this.Text = tb.Text;
base.OnLoad(e);
}
protected override void OnPreRender(EventArgs e)
{

CreateChildControls();
base.OnPreRender(e);
}
protected override void CreateChildControls()
{
Controls.Clear();

switch (ViewMode)
{
case "Edit":
AuthoringPlaceholder();
break;
case "default":
TextPlaceHolder();
break;
}
base.CreateChildControls();
}
protected void AuthoringPlaceholder()
{
tb = new TextBox();
this.tb.ID = this.ID;
this.tb.TextMode = TextBoxMode.MultiLine;
//this.tb.Text = Text; Don't need to set this
this.tb.Columns = 40;
this.tb.Rows = 15;

Controls.Add(this.tb);
}
protected void TextPlaceHolder()
{
this.Controls.Add(new LiteralControl(this.Text));
}
}

In your page class you can switch modes like this:

protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
{
test.ViewMode = "default";
}
}

And place it in the page like this:

<cc1:HTMLPlaceholder runat=server ViewMode="Edit" id="test" />
<asp:Button runat="server" ID="submit" Text="submit" />

David wrote:
> Hi,
>
> Sorted it. A combination of OnInit and IPostBackDataHandler (which gave me a
> few headaches to make work...).
>
> It seems that IPostBackDataHandler needs to return a boolean value. What is
> this for?
>
> Best regards,
> Dave Colliver.
> http://www.Sheffiel...
> ~~
> http://www.FOCUSP... - Local franchises available
>
>
> "David" <david.colliver.NEWS@revilloc.REMOVETHIS.com> wrote in message
> news:%23JIFN64%23GHA.1220@TK2MSFTNGP05.phx.gbl...
> > Hi,
> >
> > Thank you both (tdotnet and Michael), however I am still having
> > problems... It may be a combination of both answers.
> >
> > I have written an OnInit
> >
> > protected override void OnInit(EventArgs e)
> > {
> > //tb.ID = this.ID;
> > tb.TextMode = TextBoxMode.MultiLine;
> > //this.tb.Text = Text;
> > tb.Columns = 40;
> > tb.Rows = 15;
> >
> > Controls.Add(tb);
> > base.OnInit (e);
> > }
> >
> > (Note, the Text property has been remarked, as that can only really be
> > loaded in the OnPreRender).
> >
> > This seems to prepare the textbox but on the postback, when I am trying to
> > read it, there is nothing. How do I ensure that there is text in the
> > postback?
> >
> > (I pre-load the text box in pre-render, I wish to be able to change the
> > contents and I want to see what is in the text boxes when it comes back)
> >
> > I have never used the IPostBackDataHandler. Given what I have written
> > above, does it look like this is what I need? If so, can you show me an
> > example?
> >
> > Thanks.
> >
> > Best regards,
> > Dave Colliver.
> > http://www.Ashfiel...
> > ~~
> > http://www.FOCUSP... - Local franchises available
> >
> >
> > "Michael Hamrah" <mhamrah@gmail.com> wrote in message
> > news:1162147119.046631.68450@k70g2000cwa.googlegroups.com...
> >>I think the problem you have is that you're not loading the contents of
> >> the control tree properly. I don't think .NET can find the Textbox
> >> control when a Postback happens so it can't properly set the textbox
> >> text property. This is because you're only adding the textbox in the
> >> PreRender event if the user is in edit mode.
> >>
> >> You want to sure ensure that all controls sent to the client are loaded
> >> again in the init event during a postback. THis allow .NET to properly
> >> map form objects to .NET controls. You can try either 1) Always
> >> loading the textbox but setting the visible property to true or false,
> >> 2) Add a marker that will tell the control to load the Textbox in the
> >> Init event if it was sent out during the Init event. 3) Explicitly
> >> setting the text property of the Textbox by implementing the
> >> IPostBackDataHandler interface.
> >>
> >
> >

Sizik

7/29/2008 8:49:00 PM

0

On Jul 29, 9:47 am, Jeff Lait <torespondisfut...@hotmail.com> wrote:
> On Jul 29, 3:23 am, "John Palmer" <thepa...@gmail.com> wrote:
>
> > I created a quick page on roguebasin, although interestingly you link
> > doesn't work, but just typing roguebasin into firefox takes me to the right
> > page.  An updated version of the exe is up as well, which means that ranged
> > attacks will now work and controls can be edited"
>
> Ah, thank you.  Sorry about the link, I don't know what I was
> thinking.
>
. . .
> --
> Jeff Lait
> (POWDER:http://www.zincland....)

The correct link, for those who want it, is http://roguebasin.roguelikedevel...