0

In my requirement I am creating dynamic controls by two events

  1. Dropdownlist OnSelectedIndexChanged event
  2. Onclick button event

In OnSelectedIndexChanged event i have created number of dynamic textbox.

Here I have create two dynamic textboxes. enter image description here

I am getting all enquiry product list based on enquiry number from the dynamic textboxes on button click event

enter image description here

All are dynamic controls

While saving the productlist the checkbox control return null value

  protected void ddlenqChaged(object sender, EventArgs e)
    {
        getenqTextbox();
    }
    protected void btnSearchClick(object sender, EventArgs e)
    {
        tblbill.Visible = true;

        if (Convert.ToString(ViewState["Generated"]) != "true")
        {
            CreateDynamicControls();
            ViewState["Generated"] = "true";
        }
    }


protected void getenqTextbox()
    {
        enqPanel.Controls.Clear();
        if (Convert.ToInt32(ddlNoofEnq.SelectedValue) > 0)
        {
            for (int i = 1; i <= Convert.ToInt32(ddlNoofEnq.SelectedValue); i++)
            {
                TextBox _txtCode = new TextBox();
                _txtCode.ID = "txtEnqqNo" + i;
                _txtCode.Attributes.Add("ClientIDMode", "Static");
                _txtCode.Width = 75;
                _txtCode.CssClass = "AtCompleteByEnq";
                enqPanel.Controls.Add(_txtCode);
            }
        }
    }


protected void CreateDynamicControls()
    {

        int m = 1;
        //int encount = click.buttonclick;

        if (Convert.ToInt32(ddlNoofEnq.SelectedValue) > 0)
        {
            Table tbldynamic = new Table();

            for (int k = 1; k <= Convert.ToInt32(ddlNoofEnq.SelectedValue); k++)
            {
                Panel1.Controls.Clear();
                TextBox tb = (TextBox)enqPanel.FindControl("txtEnqqNo" + k);
                if (tb != null)
                {
                    if (!String.IsNullOrEmpty(tb.Text))
                    {
                        List<Enquiry_ProductListBLL> objlst = Enquiry_ProductListBLL.GetEnquiry_ProductListBLLs(tb.Text);

                        foreach (Enquiry_ProductListBLL item in objlst)
                        {
                            TableRow tr = new TableRow();

                            TableCell tc = new TableCell();
                            TableCell tc1 = new TableCell();
                            TableCell tc2 = new TableCell();
                            TableCell tc3 = new TableCell();
                            TableCell tc4 = new TableCell();
                            TableCell tc5 = new TableCell();

                            TableCell tc6 = new TableCell();

                            Master_ProductBLL objpdt = Master_ProductBLL.GetMaster_ProductBLL(item.ProductId);

                            CheckBox _chkRowNo = new CheckBox();
                            _chkRowNo.ID = "chkRowNo" + m;
                            _chkRowNo.Text = m.ToString();
                            _chkRowNo.Attributes.Add("ClientIDMode", "Static");
                            _chkRowNo.Attributes.Add("onclick", "getEnable(this);");
                            _chkRowNo.Checked = true;

                            TextBox _txtCode = new TextBox();
                            _txtCode.ID = "txtCodeRow" + m;
                            _txtCode.Attributes.Add("ClientIDMode", "Static");
                            _txtCode.Enabled = false;
                            _txtCode.Width = 75;
                            _txtCode.Attributes.Add("autocomplete", "off");
                            _txtCode.Text = objpdt.Code;

                            HiddenField _hdnPdtId = new HiddenField();
                            _hdnPdtId.ID = "hdnPdtId" + m;
                            _hdnPdtId.Value = item.ProductId.ToString();

                            HiddenField _hdEnqNo = new HiddenField();
                            _hdEnqNo.ID = "hdEnqNo" + m;
                            _hdEnqNo.Value = item.EnqNo;

                            _hdnPdtId.Value = item.ProductId.ToString();
                            TextBox _txtPdtName = new TextBox();
                            _txtPdtName.ID = "txtPdtNameRow" + m;
                            _txtPdtName.Attributes.Add("ClientIDMode", "Static");
                            _txtPdtName.Enabled = false;
                            _txtPdtName.Width = 150;
                            _txtPdtName.CssClass = "AtCompleteByName";
                            _txtPdtName.Text = objpdt.Name;


                            TextBox _txtQty = new TextBox();
                            _txtQty.ID = "txtQtyRow" + m;
                            _txtQty.Width = 80;
                            _txtQty.MaxLength = 8;
                            _txtQty.Attributes.Add("ClientIDMode", "Static");
                            //_txtQty.Attributes.Add("onblur", "GetTotal(this)");
                            //_txtQty.Enabled = false;
                            _txtQty.Text = item.Count.ToString();

                            DropDownList ddlUnits = new DropDownList();
                            ddlUnits.ID = "ddlUnits" + m;
                            ddlUnits.CssClass = "dropdowncss";
                            ddlUnits.Width = 100;
                            Bindings.BindUnitName(ddlUnits);
                            ddlUnits.Items.FindByText(item.PP).Selected = true;

                            tc.Controls.Add(_chkRowNo);
                            tc1.Controls.Add(_txtCode);
                            tc2.Controls.Add(_txtPdtName);
                            tc2.Controls.Add(_hdnPdtId);
                            tc2.Controls.Add(_hdEnqNo);
                            tc3.Controls.Add(_txtBrand);
                            tc4.Controls.Add(_txtThickness);
                            tc5.Controls.Add(ddlUnits);
                            tc6.Controls.Add(_txtQty);

                            tc.Attributes.Add("Width", "50px");
                            tr.Attributes.Add("id", "Rowid" + m);
                            tr.Attributes.Add("class", "paidRw");

                            tr.Cells.Add(tc);
                            tr.Cells.Add(tc1);
                            tr.Cells.Add(tc2);
                            tr.Cells.Add(tc3);
                            tr.Cells.Add(tc4);
                            tr.Cells.Add(tc5);
                            tr.Cells.Add(tc6);


                            tbldynamic.Rows.Add(tr);
                            m++;
                        }
                    }
                }
            }

            Panel1.Controls.Add(tbldynamic);
        }
    }

Here I have override OnLoad event

 protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        CreateDynamicControls();
        getenqTextbox();

    }

My problem is i cannot find controls from Panel1

CheckBox chk = (CheckBox)Panel1.FindControl(chkId);
                    if (chk != null)
                    {
                        if (chk.Checked == true)
                        {
                            //my process
                        }
                    }

FindControl returns null value.

Here I have create dynamic controls two times.

I cannot have any problem with enquiry textbox, it was created first, but the second time button click event controls are return null.

Tasos K.
  • 7,979
  • 7
  • 39
  • 63
Hisanth
  • 62
  • 2
  • 9
  • If i remove getenqTextbox() method It will works perfect. I have added directly Enquiry textbox in .aspx. Only one event dynamic controls is working. How to rectify it. – Hisanth May 04 '18 at 08:54
  • This [SO post](https://stackoverflow.com/questions/4955769/better-way-to-find-control-in-asp-net) demonstrates several recursive and non-recursive solutions. – kman May 08 '18 at 16:58

1 Answers1

0

FindControl does not walk the hierarchy. See doc Control.FindControl()

This method will find a control only if the control is directly contained by the specified container; that is, the method does not search throughout a hierarchy of controls within controls.

Since your CheckBox is not a first-level child of the Panel, it cannot be retrieved this way. If you need a generic solution, I suggest to implement a recursive FindControl.