0

I am adding dynamic textbox and label. I want to create dynamic control with label and textbox. After that I need to get the value on from submit, but I am not able to get the value I added my control into table.

    if (!string.IsNullOrEmpty(dynamicFieldstring))
    {
        string[] groupControl = dynamicFieldstring.Split('|');

        for (int i = 0; i < groupControl.Length; )
        {
            TableRow row = new TableRow();

            for (int j = 0; j < 2; j++)
            {
                if (i >= groupControl.Length)
                    break;

                string[] singleControl = groupControl[i].Split('=');

                Label label = new Label();
                TextBox textbox = new TextBox();
                string textboxId = string.Empty;
                string labelId = string.Empty;
                TableCell cell = new TableCell();

                label.Text = singleControl[0];
                labelId = "lbl" + i + j;
                label.ID = textboxId;
                label.Attributes.Add("runat", "server");
                cell.Controls.Add(label);

                TableCell cell1 = new TableCell();
                textbox.Text = singleControl[1];
                textboxId = "txt" + i + j;
                textbox.ID = textboxId;
                textbox.Attributes.Add("runat", "server");
                cell1.Controls.Add(textbox);

                _dynamicControlId.Add(labelId, textboxId);
                Session["controllIds"] = _dynamicControlId;
                // Add the TableCell to the TableRow
                row.Cells.Add(cell);
                row.Cells.Add(cell1);
                //}

                i = i + 1;
            }

            extraAttr.Rows.Add(row);
        }

Value added successfully, but when I am trying to get value from the code. I am getting null value. This is my code for get the value:

    string value = string.Empty;
    _dynamicControlId = (Dictionary<string, string>)Session["controllIds"];
    if (_dynamicControlId != null && _dynamicControlId.Count > 0)
    {
        TextBox textbox;

        for (int i = 0; i < this.Controls.Count; i++)
        {
           var control= this.Controls[i];
        }

        foreach (var item in _dynamicControlId)
        {
            Label label = (Label)this.FindControl(item.Key);
            //value = Request.Form("something_TextoxFirstName");
            value = label.Text + "=";
            textbox = (TextBox)this.FindControl(item.Value);
            value += textbox.Text + "|";
        }
    }
    return value;
Win
  • 61,100
  • 13
  • 102
  • 181
Pallav Jha
  • 43
  • 7

1 Answers1

0

The trick of dynamic controls is you will need to reload them back on postback, since they are not in the control tree. We normally reload them back inside either Page Init event or Page Load event.

Another issue is FindControl only looks for immediate child. If you want to find a control nested inside other controls, you will need to find it recursively.

enter image description here

Result

enter image description here

<asp:Table runat="server" ID="extraAttr" />
<asp:Button runat="server" ID="SubmitButton" OnClick="SubmitButton_Click" Text="Submit" />
<br/>
<asp:Label runat="server" ID="ResultLabel" />

Code Behind

public partial class _Default : Page
{
    Dictionary<string, string> _dynamicControlId = new Dictionary<string, string>();

    protected void Page_Init(object sender, EventArgs e)
    {
        CreateControls();
    }

    protected void SubmitButton_Click(object sender, EventArgs e)
    {
        ResultLabel.Text = "Result : " + RetrieveValues();
    }

    private void CreateControls()
    {
        string dynamicFieldstring = "one=1|two=2|three=3|four=4";
        if (!string.IsNullOrEmpty(dynamicFieldstring))
        {
            string[] groupControl = dynamicFieldstring.Split('|');

            for (int i = 0; i < groupControl.Length;)
            {
                TableRow row = new TableRow();

                for (int j = 0; j < 2; j++)
                {
                    if (i >= groupControl.Length)
                        break;

                    string[] singleControl = groupControl[i].Split('=');

                    Label label = new Label();
                    TextBox textbox = new TextBox();
                    string textboxId = string.Empty;
                    string labelId = string.Empty;
                    TableCell cell = new TableCell();

                    label.Text = singleControl[0];
                    labelId = "lbl" + i + j;
                    label.ID = labelId; // <--- value should be labelId instead of textboxId
                    label.Attributes.Add("runat", "server");
                    cell.Controls.Add(label);

                    TableCell cell1 = new TableCell();
                    textbox.Text = singleControl[1];
                    textboxId = "txt" + i + j;
                    textbox.ID = textboxId;
                    textbox.Attributes.Add("runat", "server");
                    cell1.Controls.Add(textbox);

                    _dynamicControlId.Add(labelId, textboxId);
                    row.Cells.Add(cell);
                    row.Cells.Add(cell1);
                    i = i + 1;
                }
                extraAttr.Rows.Add(row);
                Session["controllIds"] = _dynamicControlId;
            }
        }
    }

    private string RetrieveValues()
    {
        string value = string.Empty;
        _dynamicControlId = Session["controllIds"] as Dictionary<string, string>;
        if (_dynamicControlId != null && _dynamicControlId.Count > 0)
        {

            foreach (var item in _dynamicControlId)
            {
                Label label = FindControlRecursive(extraAttr, item.Key) as Label;
                value += label.Text + "="; // <--- Operator should be should be +=
                var textbox = FindControlRecursive(extraAttr, item.Value) as TextBox;
                value += textbox.Text + "|";
            }
        }
        return value;
    }

    private Control FindControlRecursive(Control root, string id)
    {
        if (root.ID == id)
            return root;

        return root.Controls.Cast<Control>()
            .Select(c => FindControlRecursive(c, id))
            .FirstOrDefault(c => c != null);
    }
}
Win
  • 61,100
  • 13
  • 102
  • 181