Dynamically adding a custom control

Discussion in 'ASP .Net Building Controls' started by Terry Holland, Nov 23, 2005.

  1. Steven

    Im getting in a bit of a mess with this. What I want to end up with is a
    set of controls for editing / displaying fields on a webform. I would like
    to be able to dynamically add these controls to webforms as and when I need
    them.

    Initially I need three types of fields

    ctlFieldReadOnly
    ctlFieldEditable
    ctlFieldEditableRequired

    Each of these controls will consist of the following controls:

    ctlFieldReadOnly: Label (lblLabel) and a label (lblValue) to display the
    data
    ctlFieldEditable: Label (lblLabel) and a textbox (txtValue - background
    colour blue) to the display the data
    ctlFieldEditableRequired: Label (lblLabel) and a textbox (txtValue -
    background colour yellow) to the display the data.

    Each of these controls needs to expose a Label property and a Value
    property.
    Each control should be able to be configured so the either, the Label
    control is above the Value control, or the Label control appears to the Left
    of the Value control.

    Each form may contain any number of each type of control.

    Ive been trying to develop along the following lines:
    Create a Base control such as ctlField that must be inherited. This control
    will contain the properties Label, Value, Width and HorizontalAlignment.
    Im then trying to derive the required controls from this control. My derived
    controls should add the relevant webcontrols ie Label to display the Value
    for a ctlReadOnly control, a Textbox to display the Value for
    ctlFieldEditable & ctlFieldEditableRequired controls.
    Im getting various results ranging from no controls being displayed, not
    being able to refer to controls in order to read/write values.

    It would be very helpful if you could provide a small sample of how I might
    get this sort of scenario to work (VB if possible - I know you prefer C#)


    Terry



    "Terry Holland" <> wrote in message
    news:...
    > We meet again Steven.
    >
    > Ive modified my code to remove the New keyword and added the LoadControl
    > method in my page to load the control and now the user control appears on
    > the screen.
    >
    > Thanks
    >
    > Terry Holland
    >
    >
    > "Steven Cheng[MSFT]" <> wrote in message
    > news:jlvfhG$...
    >> Hi Terry,
    >>
    >> As for ASP.NET Usercontrol(ascx...), the Control instances are all
    >> defined
    >> in the .ascx template file(if not dynamically adding control...), so we
    >> should not declare "New" for control reference like:
    >>
    >> Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    >>
    >> If you get error when not using "New", there must have something
    >> incorrect
    >> in our page or code logic. Would you also provide the ascx template
    >> together with the code behind?
    >>
    >> In addition, for dynamically adding Usercontrol onto aspx page, we should
    >> use the Page.LoadControl method to load the "xxx.ascx" so as to create
    >> the
    >> UserControl instance and add it into Container control in each Page
    >> Request....
    >>
    >> If there're anything unclear, please feel free to post here.
    >>
    >> Regards,
    >>
    >> Steven Cheng
    >> Microsoft Online Support
    >>
    >> Get Secure! www.microsoft.com/security
    >> (This posting is provided "AS IS", with no warranties, and confers no
    >> rights.)
    >>
    >>
    >> --------------------
    >> | From: "Terry Holland" <>
    >> | Subject: Dynamically adding custom control
    >> | Date: Thu, 17 Nov 2005 21:28:24 -0000
    >> | Lines: 149
    >> | X-Priority: 3
    >> | X-MSMail-Priority: Normal
    >> | X-Newsreader: Microsoft Outlook Express 6.00.2900.2527
    >> | X-RFC2646: Format=Flowed; Original
    >> | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2527
    >> | Message-ID: <#>
    >> | Newsgroups: microsoft.public.dotnet.framework.aspnet.buildingcontrols
    >> | NNTP-Posting-Host: host10.harsco.com 209.183.189.10
    >> | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
    >> | Xref: TK2MSFTNGXA02.phx.gbl
    >> microsoft.public.dotnet.framework.aspnet.buildingcontrols:13997
    >> | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.buildingcontrols
    >> |
    >> | Im trying to dynamically add a user control for a webform but it is not
    >> | appearing when I run the form.
    >> |
    >> | I have pasted the code that I am using. Can someone advise what Im
    >> doing
    >> | wrong. My user control (ctlTextBox) contains one textbox. When I
    >> dragged
    >> | this onto the control, the line
    >> |
    >> | Protected WithEvents txt As System.Web.UI.WebControls.TextBox
    >> |
    >> | was added the declarations area of the code module. Without changing
    >> this
    >> | to
    >> |
    >> | Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    >> |
    >> | An error is generated on my page as soon as I hit the line
    >> |
    >> | .Text = "Tesing Control"
    >> |
    >> | Also, if I drag ctlTextBox onto my form at design time, it displays OK
    >> |
    >> |
    >> | ==========================
    >> | User Control Code
    >> | ==========================
    >> | Public Class ctlTextBox
    >> | Inherits System.Web.UI.UserControl
    >> |
    >> | #Region " Web Form Designer Generated Code "
    >> |
    >> | 'This call is required by the Web Form Designer.
    >> | <System.Diagnostics.DebuggerStepThrough()> Private Sub
    >> | InitializeComponent()
    >> |
    >> | End Sub
    >> |
    >> | '############################################################
    >> | '## This is the code that was generated
    >> | ############
    >> | '## but without the New keyword, a runtime error is generated
    >> | ############
    >> | '## when I try to set the Text property on the page
    >> | ############
    >> | '############################################################
    >> | 'Protected WithEvents txt As System.Web.UI.WebControls.TextBox
    >> | Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    >> |
    >> | 'NOTE: The following placeholder declaration is required by the Web
    >> Form
    >> | Designer.
    >> | 'Do not delete or move it.
    >> | Private designerPlaceholderDeclaration As System.Object
    >> |
    >> | Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    >> | System.EventArgs) Handles MyBase.Init
    >> | 'CODEGEN: This method call is required by the Web Form Designer
    >> | 'Do not modify it using the code editor.
    >> | InitializeComponent()
    >> | End Sub
    >> |
    >> | #End Region
    >> |
    >> | Public Property Width() As Integer
    >> | Get
    >> | Return txt.Width.Value
    >> | End Get
    >> | Set(ByVal Value As Integer)
    >> | txt.Width = Unit.Pixel(Value)
    >> | End Set
    >> | End Property
    >> |
    >> | Public Property Text() As String
    >> | Get
    >> | Return txt.Text
    >> | End Get
    >> | Set(ByVal Value As String)
    >> | txt.Text = Value
    >> | End Set
    >> | End Property
    >> |
    >> | Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    >> | System.EventArgs) Handles MyBase.Load
    >> | 'Put user code to initialize the page here
    >> | txt.CssClass = "Editable"
    >> | End Sub
    >> |
    >> | End Class
    >> | ===========================
    >> | End User Control Code
    >> | ===========================
    >> |
    >> |
    >> | ===========================
    >> | Page Code
    >> | ===========================
    >> | Public Class pgeTest
    >> | Inherits System.Web.UI.Page
    >> |
    >> | #Region " Web Form Designer Generated Code "
    >> |
    >> | 'This call is required by the Web Form Designer.
    >> | <System.Diagnostics.DebuggerStepThrough()> Private Sub
    >> | InitializeComponent()
    >> |
    >> | End Sub
    >> |
    >> | Protected WithEvents Panel1 As System.Web.UI.WebControls.Panel
    >> |
    >> | 'NOTE: The following placeholder declaration is required by the Web
    >> Form
    >> | Designer.
    >> | 'Do not delete or move it.
    >> | Private designerPlaceholderDeclaration As System.Object
    >> |
    >> | Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    >> | System.EventArgs) Handles MyBase.Init
    >> | 'CODEGEN: This method call is required by the Web Form Designer
    >> | 'Do not modify it using the code editor.
    >> | InitializeComponent()
    >> | End Sub
    >> |
    >> | #End Region
    >> |
    >> | Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    >> | System.EventArgs) Handles MyBase.Load
    >> | BuildControls()
    >> | End Sub
    >> |
    >> |
    >> | Sub BuildControls()
    >> | Dim tb As New ctlTextBox
    >> | With tb
    >> | .Text = "Tesing Control"
    >> | End With
    >> | Panel1.Controls.Add(tb)
    >> |
    >> | Dim txt As New TextBox
    >> | txt.Text = "Hello"
    >> | Panel1.Controls.Add(txt)
    >> |
    >> | Dim lbl As New Label
    >> | lbl.Text = "Label"
    >> | Panel1.Controls.Add(lbl)
    >> |
    >> | End Sub
    >> |
    >> | End Class
    >> | ===============================
    >> | End of Page Code
    >> | ===============================
    >> |
    >> |
    >> |
    >>

    >
    >
    Terry Holland, Nov 23, 2005
    #1
    1. Advertising

  2. Hi Terry,

    Regarding on your new question, I've posted response in the former thread.
    For your convenience, I've pasted my message here:

    ===============
    Hey Terry,

    As for custom webserver control(need to expose some nested sub control's
    properties...), we need to pay attention to serveral things especially when
    they're dynanically created on page. So I'd suggest you try making them
    work when you statically declare them on page, that'll help make your
    problem simplified...

    Regards,

    Steven Cheng
    Microsoft Online Support
    =====================

    So I think it'll be better if you can get it work when you statically
    declare the control in page rather than dynamically adding them. Also, you
    can start from creating a ascx UserControl which will also make things
    simpler ....

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! www.microsoft.com/security
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)


    --------------------
    | From: "Terry Holland" <>
    | Subject: Dynamically adding a custom control
    | Date: Wed, 23 Nov 2005 12:15:59 -0000
    | Lines: 274
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    | Message-ID: <>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.buildingcontrols
    | NNTP-Posting-Host: host240.multiserv.com 194.200.135.240
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.buildingcontrols:14036
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.buildingcontrols
    |
    | Steven
    |
    | Im getting in a bit of a mess with this. What I want to end up with is a
    | set of controls for editing / displaying fields on a webform. I would
    like
    | to be able to dynamically add these controls to webforms as and when I
    need
    | them.
    |
    | Initially I need three types of fields
    |
    | ctlFieldReadOnly
    | ctlFieldEditable
    | ctlFieldEditableRequired
    |
    | Each of these controls will consist of the following controls:
    |
    | ctlFieldReadOnly: Label (lblLabel) and a label (lblValue) to display the
    | data
    | ctlFieldEditable: Label (lblLabel) and a textbox (txtValue - background
    | colour blue) to the display the data
    | ctlFieldEditableRequired: Label (lblLabel) and a textbox (txtValue -
    | background colour yellow) to the display the data.
    |
    | Each of these controls needs to expose a Label property and a Value
    | property.
    | Each control should be able to be configured so the either, the Label
    | control is above the Value control, or the Label control appears to the
    Left
    | of the Value control.
    |
    | Each form may contain any number of each type of control.
    |
    | Ive been trying to develop along the following lines:
    | Create a Base control such as ctlField that must be inherited. This
    control
    | will contain the properties Label, Value, Width and HorizontalAlignment.
    | Im then trying to derive the required controls from this control. My
    derived
    | controls should add the relevant webcontrols ie Label to display the Value
    | for a ctlReadOnly control, a Textbox to display the Value for
    | ctlFieldEditable & ctlFieldEditableRequired controls.
    | Im getting various results ranging from no controls being displayed, not
    | being able to refer to controls in order to read/write values.
    |
    | It would be very helpful if you could provide a small sample of how I
    might
    | get this sort of scenario to work (VB if possible - I know you prefer C#)
    |
    |
    | Terry
    |
    |
    |
    | "Terry Holland" <> wrote in message
    | news:...
    | > We meet again Steven.
    | >
    | > Ive modified my code to remove the New keyword and added the LoadControl
    | > method in my page to load the control and now the user control appears
    on
    | > the screen.
    | >
    | > Thanks
    | >
    | > Terry Holland
    | >
    | >
    | > "Steven Cheng[MSFT]" <> wrote in message
    | > news:jlvfhG$...
    | >> Hi Terry,
    | >>
    | >> As for ASP.NET Usercontrol(ascx...), the Control instances are all
    | >> defined
    | >> in the .ascx template file(if not dynamically adding control...), so
    we
    | >> should not declare "New" for control reference like:
    | >>
    | >> Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    | >>
    | >> If you get error when not using "New", there must have something
    | >> incorrect
    | >> in our page or code logic. Would you also provide the ascx template
    | >> together with the code behind?
    | >>
    | >> In addition, for dynamically adding Usercontrol onto aspx page, we
    should
    | >> use the Page.LoadControl method to load the "xxx.ascx" so as to create
    | >> the
    | >> UserControl instance and add it into Container control in each Page
    | >> Request....
    | >>
    | >> If there're anything unclear, please feel free to post here.
    | >>
    | >> Regards,
    | >>
    | >> Steven Cheng
    | >> Microsoft Online Support
    | >>
    | >> Get Secure! www.microsoft.com/security
    | >> (This posting is provided "AS IS", with no warranties, and confers no
    | >> rights.)
    | >>
    | >>
    | >> --------------------
    | >> | From: "Terry Holland" <>
    | >> | Subject: Dynamically adding custom control
    | >> | Date: Thu, 17 Nov 2005 21:28:24 -0000
    | >> | Lines: 149
    | >> | X-Priority: 3
    | >> | X-MSMail-Priority: Normal
    | >> | X-Newsreader: Microsoft Outlook Express 6.00.2900.2527
    | >> | X-RFC2646: Format=Flowed; Original
    | >> | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2527
    | >> | Message-ID: <#>
    | >> | Newsgroups: microsoft.public.dotnet.framework.aspnet.buildingcontrols
    | >> | NNTP-Posting-Host: host10.harsco.com 209.183.189.10
    | >> | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
    | >> | Xref: TK2MSFTNGXA02.phx.gbl
    | >> microsoft.public.dotnet.framework.aspnet.buildingcontrols:13997
    | >> | X-Tomcat-NG:
    microsoft.public.dotnet.framework.aspnet.buildingcontrols
    | >> |
    | >> | Im trying to dynamically add a user control for a webform but it is
    not
    | >> | appearing when I run the form.
    | >> |
    | >> | I have pasted the code that I am using. Can someone advise what Im
    | >> doing
    | >> | wrong. My user control (ctlTextBox) contains one textbox. When I
    | >> dragged
    | >> | this onto the control, the line
    | >> |
    | >> | Protected WithEvents txt As System.Web.UI.WebControls.TextBox
    | >> |
    | >> | was added the declarations area of the code module. Without changing
    | >> this
    | >> | to
    | >> |
    | >> | Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    | >> |
    | >> | An error is generated on my page as soon as I hit the line
    | >> |
    | >> | .Text = "Tesing Control"
    | >> |
    | >> | Also, if I drag ctlTextBox onto my form at design time, it displays
    OK
    | >> |
    | >> |
    | >> | ==========================
    | >> | User Control Code
    | >> | ==========================
    | >> | Public Class ctlTextBox
    | >> | Inherits System.Web.UI.UserControl
    | >> |
    | >> | #Region " Web Form Designer Generated Code "
    | >> |
    | >> | 'This call is required by the Web Form Designer.
    | >> | <System.Diagnostics.DebuggerStepThrough()> Private Sub
    | >> | InitializeComponent()
    | >> |
    | >> | End Sub
    | >> |
    | >> | '############################################################
    | >> | '## This is the code that was generated
    | >> | ############
    | >> | '## but without the New keyword, a runtime error is generated
    | >> | ############
    | >> | '## when I try to set the Text property on the page
    | >> | ############
    | >> | '############################################################
    | >> | 'Protected WithEvents txt As System.Web.UI.WebControls.TextBox
    | >> | Protected WithEvents txt As New System.Web.UI.WebControls.TextBox
    | >> |
    | >> | 'NOTE: The following placeholder declaration is required by the
    Web
    | >> Form
    | >> | Designer.
    | >> | 'Do not delete or move it.
    | >> | Private designerPlaceholderDeclaration As System.Object
    | >> |
    | >> | Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    | >> | System.EventArgs) Handles MyBase.Init
    | >> | 'CODEGEN: This method call is required by the Web Form
    Designer
    | >> | 'Do not modify it using the code editor.
    | >> | InitializeComponent()
    | >> | End Sub
    | >> |
    | >> | #End Region
    | >> |
    | >> | Public Property Width() As Integer
    | >> | Get
    | >> | Return txt.Width.Value
    | >> | End Get
    | >> | Set(ByVal Value As Integer)
    | >> | txt.Width = Unit.Pixel(Value)
    | >> | End Set
    | >> | End Property
    | >> |
    | >> | Public Property Text() As String
    | >> | Get
    | >> | Return txt.Text
    | >> | End Get
    | >> | Set(ByVal Value As String)
    | >> | txt.Text = Value
    | >> | End Set
    | >> | End Property
    | >> |
    | >> | Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    | >> | System.EventArgs) Handles MyBase.Load
    | >> | 'Put user code to initialize the page here
    | >> | txt.CssClass = "Editable"
    | >> | End Sub
    | >> |
    | >> | End Class
    | >> | ===========================
    | >> | End User Control Code
    | >> | ===========================
    | >> |
    | >> |
    | >> | ===========================
    | >> | Page Code
    | >> | ===========================
    | >> | Public Class pgeTest
    | >> | Inherits System.Web.UI.Page
    | >> |
    | >> | #Region " Web Form Designer Generated Code "
    | >> |
    | >> | 'This call is required by the Web Form Designer.
    | >> | <System.Diagnostics.DebuggerStepThrough()> Private Sub
    | >> | InitializeComponent()
    | >> |
    | >> | End Sub
    | >> |
    | >> | Protected WithEvents Panel1 As System.Web.UI.WebControls.Panel
    | >> |
    | >> | 'NOTE: The following placeholder declaration is required by the
    Web
    | >> Form
    | >> | Designer.
    | >> | 'Do not delete or move it.
    | >> | Private designerPlaceholderDeclaration As System.Object
    | >> |
    | >> | Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    | >> | System.EventArgs) Handles MyBase.Init
    | >> | 'CODEGEN: This method call is required by the Web Form
    Designer
    | >> | 'Do not modify it using the code editor.
    | >> | InitializeComponent()
    | >> | End Sub
    | >> |
    | >> | #End Region
    | >> |
    | >> | Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    | >> | System.EventArgs) Handles MyBase.Load
    | >> | BuildControls()
    | >> | End Sub
    | >> |
    | >> |
    | >> | Sub BuildControls()
    | >> | Dim tb As New ctlTextBox
    | >> | With tb
    | >> | .Text = "Tesing Control"
    | >> | End With
    | >> | Panel1.Controls.Add(tb)
    | >> |
    | >> | Dim txt As New TextBox
    | >> | txt.Text = "Hello"
    | >> | Panel1.Controls.Add(txt)
    | >> |
    | >> | Dim lbl As New Label
    | >> | lbl.Text = "Label"
    | >> | Panel1.Controls.Add(lbl)
    | >> |
    | >> | End Sub
    | >> |
    | >> | End Class
    | >> | ===============================
    | >> | End of Page Code
    | >> | ===============================
    | >> |
    | >> |
    | >> |
    | >>
    | >
    | >
    |
    |
    |
    |
    Steven Cheng[MSFT], Nov 24, 2005
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Gibble
    Replies:
    0
    Views:
    466
    Gibble
    May 17, 2007
  2. Gibble
    Replies:
    0
    Views:
    327
    Gibble
    May 17, 2007
  3. Gibble
    Replies:
    0
    Views:
    319
    Gibble
    May 17, 2007
  4. Matt Sokol
    Replies:
    2
    Views:
    366
    Theo Tillotson
    Aug 7, 2003
  5. Terry Holland

    Dynamically adding custom control

    Terry Holland, Nov 17, 2005, in forum: ASP .Net Building Controls
    Replies:
    11
    Views:
    312
    Steven Cheng[MSFT]
    Nov 30, 2005
Loading...

Share This Page