搜索动态控件时,FindControl()返回null

时间:2018-05-04 04:47:33

标签: c# asp.net webforms

在我的要求中,我正在通过两个事件创建动态控件

  1. 下拉列表OnSelectedIndexChanged活动
  2. Onclick按钮事件
  3. 在OnSelectedIndexChanged事件中,我创建了多个动态文本框。

    这里我创建了两个动态文本框。 enter image description here

    我根据按钮点击事件

    上的动态文本框中的查询号码获取所有查询产品列表

    enter image description here

    所有都是动态控件

    在保存产品列表时,复选框控件返回空值

      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);
            }
        }
    

    这里我有覆盖OnLoad事件

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

    我的问题是我无法从Panel1找到控件

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

    FindControl返回null值。

    这里我已经创建了两次动态控件。

    我对查询文本框没有任何问题,它首先创建,但第二次按钮单击事件控件返回null。

1 个答案:

答案 0 :(得分:0)

FindControl不会遍历层次结构。 请参阅文档Control.FindControl()

仅当控件直接包含在指定容器中时,此方法才会找到控件;也就是说,该方法不会在控件中的控件层次结构中进行搜索。

由于CheckBox不是Panel的第一级子级,因此无法以这种方式检索它。如果您需要通用解决方案,我建议实现递归FindControl。