【问题标题】:FindControl() returns null when searching for dynamic controlFindControl() 搜索动态控件时返回 null
【发布时间】:2018-05-04 04:47:32
【问题描述】:

根据我的要求,我通过两个事件创建动态控件

  1. 下拉列表OnSelectedIndexChanged事件
  2. Onclick 按钮事件

在 OnSelectedIndexChanged 事件中,我创建了多个动态文本框。

在这里我创建了两个动态文本框。

我正在从按钮点击事件的动态文本框中获取所有基于查询编号的查询产品列表

都是动态控件

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

  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。

【问题讨论】:

  • 如果我删除 getenqTextbox() 方法,它将完美运行。我在.aspx 中直接添加了查询文本框。只有一个事件动态控件在工作。如何纠正它。
  • 这个SO post 演示了几种递归和非递归解决方案。

标签: c# asp.net webforms


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2011-04-06
    • 2013-09-20
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多