C# - Dynamically Added Controls End Up Wrapped In A Generic Type?
Dec 7, 2010
I'm writing a formbuilder for our CMS which dynamically loads bespoke controls into panels within a repeater.
The bespoke controls all inherit from, lets say 5arx.FormBuilder.FormControl, a base class which defines abstract methods for initialising, validating, repopulating, gathering submitted data from them. Controls range from simple text fields to complex, composite client-side controls.
It all works very well, but I've noticed something I feel is anomalous. During the course of writing code to retrieve form controls. gather their data and persist it to my database I noticed that their type reverts to the way objects get typed if you write your code in the (v. irritating) VS 'website project' mode.
So, for example a control that is defined as living in a namespace and being of type
Getting the BaseType property will correctly retrieve the underlying class, but it is perplexing to me why this should be happening. Particularly as I spent much of the summer refactoring our app from its original form as VS Website project (complete with shared code in the App_Code folder and other nastiness) to the (IHMO) correct web application project + supporting claass libraries so that we would have control over our namespaces and not get everything compiled into the ASP.x namespace
EDIT: Modified the (hypothetical) example root namespace.
However, when I try to build the control I'm getting the error as shown in the subject. I've tried searching, and it seems the signature for the original function matches the one I have, and all other solutions I've seen uses the same signature.
I'm trying to create a validation layer that will contain methods to validate all my objects (in my Business Objects layer) .. but when I try to reference both the validation and business objects to each other I get a circular dependency error .. so I've decided to create a new layer (BLL) to validate the objects for me and I'll be able to reference both the validation and the object layers.
so I want to build some kind of class/interface -I don't know what fits more- to be like a generic type or a parent type that my method could accept it as a parameter and check for it's Name/ID property. Instead of defining a new method overload for each object type I have Simplification
I am creating a survey page that has a list of questions and answers that can be radiobuttonlists, checkboxlists or textboxes. These controls are added dynamically to a Repeater in its ItemDataBound event using Controls.Add.
I've managed to render the page ok but when I submit the form and iterate over the controls in the repeater to get the selectedvalues of the radiobuttons and textbox values, FindControl returns null. What do I need to do to get get the selected values? I've tried iterating over the RepeaterItems but that returned null too. I've tried different types of FindControl but it never resolves the control types.
It works if I add a declarative DataBinder in the Repeater like this
However, I want want to dynamically add the controls but in doing this i cant get the selectedvalues when submitting. This is tha main structure of my code...
Now i can populate my gridview trough code by this: //gvwDiensten.DataSource = new BindingList<diensten>(dataManager.GetList<diensten>().ToList());But i would like to use an objectdatasource, so i created this:
[Code]....
</asp:ObjectDataSource>
But when running the page i get:
ObjectDataSource 'dsDiensten' could not find a non-generic method 'GetList' that has no parameters.
I have to dynamically create controls and add them to a table. In a button click I need to find the value entered for that control. The control ids are also dynamic. Below is the code I tried.
[code]....
the problem is that i m getting the rowcount=0 of the table tblUdf inside which i added the table rows and controls inside the table cells.
how to get the control values of the dynamically added controls.
I am just trying to add some dynamic controls to the SimpleQueryControl (which of course is a kind of Web Control and inherits all the methods accordingly). I dont know how to get the values of Child controls which I have added dynamically.
The controls show up fine on the page, but they don't show up when I view source, nor can I access them from the code behind.If I add the controls in the on_init method, they work. But I have some business rules driving changes to the list of controls itself that require I fire the add method elsewhere. Has anyone seen this before? I'm away from work so I can't copy the exact code.
I have two terrible ideas for how to get it working. One involves some jQuery and a set of hidden controls holding a big array of integers; the other is run the method on_init AND on my other events so the controls at least show up. Both smell like ugly hacks.
I am having trouble getting the input values of dynamically created controls in a ListView.
Here is my ListView:
[code]....
The textbox is found, but there is no value. It's like I just wrote over the textboxes with new ones in the previous block. If I remove the previous block of code no textboxes are ever found.
I am trying to create a RadioButtonListWithOther class that extends the RadoButtonList but I can't get the "Other" textbox to render on the page. When I step through while debugging I can see the control in the parent control's Controls collectio but it still doesn't render.
public class RadioButtonListWithOther : RadioButtonList { private TextBox _otherReason; public RadioButtonListWithOther() { _otherReason = new TextBox(); _otherReason.TextMode = TextBoxMode.MultiLine; _otherReason.Rows = 6; _otherReason.Width = Unit.Pixel(300); _otherReason.Visible = true; } protected override void CreateChildControls() { this.Controls.Add(_otherReason); this.EnsureChildControls(); base.CreateChildControls(); } protected override void OnSelectedIndexChanged(EventArgs e) { _otherReason.Enabled = false; if (OtherSelected()) { _otherReason.Enabled = true; } base.OnSelectedIndexChanged(e); } public override string Text { get { if (OtherSelected()) { return _otherReason.Text; } return base.Text; } set { base.Text = value; } } public override bool Visible { get { return base.Visible; } set { //Push visibility changes down to the children controls foreach (Control control in this.Controls) { control.Visible = value; } base.Visible = value; } } private bool OtherSelected() { if (this.SelectedItem.Text == "Other") { return true; } return false; } }
Here is my code to add an instance of this control to the WebForm:
Ihave the following code and would like to be able to control the layout of the textboxes and labels so they arent just in a long column. Right now everything works and controls are added, but they are added in 1 column which if you chose 32 from the dropdown the page becomes very long.. so would like to maybe wrap them across 3 columns so that each has at least 10 per column.
I have a user control, which is added dynamically, but I have noticed that when it is on the page and viewing the source that none of the controls within have been given unique ids. How do I give my user control and the controls within unique ids in order that I can use them in my events?
I'm building an ASP.NET UserControl where users of the website can upload several pictures at once. I'm doing it the old fashioned way by letting the user enter the amount of FileUpload controls wanted and then add them dynamically from C# to a asp:Panel control.
While this works, the values/files from the FileUpload isn't stored for when the user clicks the "Save" button. How exactly do I go about this problem?
My code for specifying the amount of FileUpload controls wanted:
I'm adding a serires of asp:literal and asp:textbox controls to a panel in code as below (the eventual aim being to add only some of the controls depending on the user):
[code]....
How can I control how the panel is rendered, preferably without having to create a custom control?
I am trying figure out how I handle events in a dynamically added user control. Basically I can add user controls dynamically to my form (I am then storing them in an ArrayList in a Session variable that I use to reload them on my Page_Load). Each control has a button on it. However, whenever I click the button, the event never fires (code is never reached). I assume it has something to do with the control being dynamic, and when I click a button, it goes out of scope, and when I reload it something is lose in the event handling.
Here's my code for adding a user control:
Code: Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load Dim alContact As New ArrayList If Not IsPostBack Then ' Dummy controls for testing Dim oContact As New ASP.ContactControl
I have a C# web application that dynamically adds user controls to the default page for whatever "mode" the application is in. The problem is that it is not persisting these across postbacks. How do I persist these across postbacks and keep the content of the controls that are in the user control?
For instance, say I have a user control that creates a new tour record. The user clicks on the Tour item from the menu on the default page, it dynamically loads the tours user control. The user then fills out the form in the tours user control and clicks save. This is where the problem happens. When the postback occurs, the web application has no idea that the new tours user control was ever loaded. So, no save takes place because the Save button's click event never even gets fired.
I am trying to create a form that is made up of controls with values that represent an entity with multiple child entities.
The form will represent a product with multiple properties where the user will then be able to create options with multiple properties which in turn be able to create multiple option-items with multiple properties.
My question is what is the best approach? Can i use ajax to avoid postbacks and having to rewrite the controls to the page? If i dynamically add the controls in the form of table rows or grid rows will the data/control values be available in the code-behind when i submit?
This is an age old question.. the last time i had to do this was .Net 2.0, pre-ajax (for me) and i was forced to recreate all the controls on each post back.
I have user controls with buttons that have hooked events. Controls with events need to be initialized in Page_Load or earlier.
I wish to spawn these user controls dynamically by clicking an Add button.
It is important to remember that events, such as click events, are not fired until just before Page_LoadComplete.
Broken Solution A:
[code]...
Result: Everything works great, except the button within the added user control is inert.
The conundrum is: I need controls to spawned by a button click, which means I need to put my Controls.Add(...) code in Page_LoadComplete. Inversely, I need the controls being added to have working events, which means the Controls.Add(...) code need to be in Page_Load. I have a perfect dichotomy.
How to maintain view state for the dynamically added html controls to a table using javascript(Below is the javascript which I am using to add HTML Controls Dynamically"). Because during the postbacks if I found any error while validating the data present in the dynamically added html controls, the controls are loosing their state and again I need to start adding rows and add data.
I have ONE <asp:Button ID="btnAddUC" runat="server" ......./> and ONE <asp:Table ID="tblUC" runat="server"...> on my page. User clicks on btnAddUC, user control is added to the page [user can add 'n' user controls to the page]. here I have no problem, adding user controls to the page on user clicks.
My user control has ONE <asp:DropDownList ID="ddlItems" runat="server" ......./> and ONE <asp:CheckBoxList ID="chkItems" runat="server"..../>. I am exposing "ddlItems" by public method, "chkItems" is not exposed. "chkItems" is binded on SelectedIndexChanged event of "ddlItems".
Execution scenario:
User adds user control to the page, select item from the "ddlItems" ( Note: "ddlItems" is exposed by public property ) , "chkItems" is populated ( using ddlItems.SelectedItem.Value ) . User checks some checkboxes in "chkItems" and then decide to add one more user control. When the second user control is added to the page, checkboxes in the first usercontrol lose their state and apeears unchecked (NOTE: user checked some checkboxes and then added another user control).
I want to put checked beckboxes index in session ( Before another control is added, which event I should use, because at LOAD event there is nothing).
I was able to restict SelectedIndexChanged event to only that user control whcih generated it (checking _EVENTTARGET)
I'm dynamically adding a DropDownList to the GridView in edit mode and I have set the TextBox Visibility to False. In edit mode I can see the DropDownList and I'm able to select an Item from the DropDownList but not able to access the SelectedValue in RowUpdating Event. How to get the selectedvalue of this DropDownList?
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound If e.Row.RowType = DataControlRowType.DataRow And (e.Row.RowState And DataControlRowState.Edit) > 0 Then Dim ddl as DropDownList FillStateList(ddl) e.Row.Cells(4).Controls.Add(ddl)
ddl is the DropDownList that is added dynamically. And the default Textbox that is in the Edit mode is set to invisible. So there are actually two controls in the same cell in edit mode(TextBox is invisible).
If I use the above statement I'm getting NullException.This is Probably because its a BoundField. Is there a way I can access the DropDownList 'ddl' SelectedValue?
I am adding linkbutton dynamically (actually above snippet tells what I am actually doing, in reality TableRow and TableCell are added dynamiccally). My problem is, I am not setting height of linkbuttuon which will added dynamically. I have no idea what text I have to add to linkbutton.
What I want, after all the link buttons are added, iterate through each added lin button, get the height of each linkbutton, store the max height, then re-iterate throgh the link buttons and set the height of each link button to max height.