【问题标题】:Trying to find controls试图找到控件
【发布时间】:2014-02-24 15:54:43
【问题描述】:

我想将runat=server动态添加到CheckBoxList,以便FindControl可以找到它。

CheckBoxList cbl = new CheckBoxList();
cbl.ID = "cbl" + intQuestionCount.ToString();

// get choices from choice list
int intChoiceListId = Convert.ToInt32(detail.ChoiceListID);
var choiceList = (from cl in _svsCentralDataContext.SVSSurvey_ChoiceListItems
                  where cl.ChoiceListID == intChoiceListId
                  orderby cl.Description
                  select cl);
cbl.DataSource = choiceList;
cbl.DataTextField = "Description";
cbl.DataBind();
cbl.Visible = true;
cbl.CssClass = "PositionCol3";

questionsPanel.Controls.Add(cbl);

我有2个递归查找控制方法:

    private HtmlControl FindHtmlControlByIdInControl(Control control, string id)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl.ID != null && childControl.ID.Equals(id, StringComparison.OrdinalIgnoreCase) 
                && childControl is HtmlControl
                )
            {
                return (HtmlControl)childControl;
            }

            if (childControl.HasControls())
            {
                HtmlControl result = FindHtmlControlByIdInControl(childControl, id);
                if (result != null)
                {
                    return result;
                }
            }
        }

        return null;
    }

    private WebControl FindWebControlByIdInControl(Control control, string id)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl.ID != null && childControl.ID.Equals(id, StringComparison.OrdinalIgnoreCase)
                && childControl is WebControl
                )
            {
                return (WebControl)childControl;
            }

            if (childControl.HasControls())
            {
                WebControl result = FindWebControlByIdInControl(childControl, id);
                if (result != null)
                {
                    return result;
                }
            }
        }

        return null;
    }

屏幕最初是基于 SQL 记录动态创建的(如果是 !isPostback)。 FindControl 方法在此批次显示后使用,当用户单击“保存”按钮时。 Find 控件方法都找不到我的 CheckBoxList!!

【问题讨论】:

  • 你拥有的是一个服务器端控件,你应该可以使用 FindControl 找到它。
  • FindControl 不是递归的,这可能是您遇到的问题: 只有当控件直接包含在指定容器中时,此方法才会找到控件;也就是说,该方法不会在控件内的控件层次结构中进行搜索 msdn.microsoft.com/en-us/library/486wc64h%28v=vs.110%29.aspx
  • 当您创建此控件并将其添加到控件组时,您处于什么事件中?猜测一下,您在页面生命周期中做得太晚了。
  • 将 CheckBoxList 类作为 WebControl 还是 HtmlControl?
  • 控件是在第一次页面加载时创建的。在单击按钮后,我正尝试将它们连同用户的响应一起读回。

标签: c# asp.net


【解决方案1】:

您正在通过您的代码添加控件,它们已经是服务器端控件,您不必添加runat="server"。您没有正确找到它们。

确保在查找之前将它们添加到页面中。

【讨论】:

  • 控件肯定已经添加到页面中,因为它们是显示出来的。单击保存时-它们似乎不存在。
  • @SteveStaple,当你点击一个按钮时,它会导致一个PostBack,并且由于 web 是无状态的,这些控件将会丢失。你必须保持他们的状态。您可以查看this question 了解更多详情,也可以查看this answer
  • 我终于让它工作了。我必须将所有动态控件的详细信息存储在会话变量中,以便在 OnInit 中重新创建它们。系统奇迹般地设法记住了用户在字段中输入的值,即使它不记得这些字段。
  • @SteveStaple,是的,这可能是一种方法,只是要谨慎存储在会话中,因为会话是为服务器上的每个用户维护的。您还可以查看每页的ViewState
  • ViewState 不好 - 它不会存储文本框、标签、复选框、CheckBoxLists 或 radioButtonList,因为它们没有“序列化”,无论这意味着什么。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2011-03-20
  • 2012-08-06
相关资源
最近更新 更多