【问题标题】:findcontrol not working for dynamically generated HTMLselectfindcontrol 不适用于动态生成的 HTMLselect
【发布时间】:2016-12-05 16:46:46
【问题描述】:

我在页面加载中的 div divQ1AnswerDDLSub 的 innerHTML 中生成 选择控件(Q1DDL 和 Q2DDL)

代码根据需要完美生成。

但是,在我按下提交按钮后,ASP.net 的 findControl 无法从 .aspx 页面中找到生成的 HTMLSELECT 控件(Q1DDL 和 Q2DDL)。

运行时 HTMLSelect 控件生成

                protected void Page_Load(object sender, EventArgs e)
   {
    if (IsPostBack)
    {
        return;
    }   
....
if (bool.Parse(questions[QNo-1].AnswerDropDownList.visibleDDl))
            {
                (FindControl("lblQ" + QNo + "AnswerDDL") as HtmlGenericControl).InnerText = questions[QNo-1].AnswerDropDownList.titleDDL;
                (FindControl("fsQ" + QNo + "DDL") as HtmlGenericControl).Style["border"] = questions[QNo - 1].AnswerDropDownList.FieldsetDDL == "no" ? "0px" : null;
                var licDDL = questions[QNo-1].AnswerDropDownList.optionDDL;
                var builder = new System.Text.StringBuilder();
                for (int i = 0; i < licDDL.Length; i++)
                    {
                        builder.Append(String.Format("<option value='{0}' title='{1}'  >{1}</option> ", licDDL[i].value, licDDL[i].text));

                    }
                if (questions[QNo-1].AnswerDropDownList.required == "yes")
                    {
                        (FindControl("divQ" + QNo + "AnswerDDLSub") as HtmlGenericControl).InnerHtml = "<select runat=\"server\" name=\"Q" + QNo + "DDL\" id=\"Q" + QNo + "DDL\" required=\"required\">" + builder.ToString() + "</select>";
                    }
                else
                    {
                        (FindControl("divQ" + QNo + "AnswerDDLSub") as HtmlGenericControl).InnerHtml = "<select runat=\"server\" name=\"Q" + QNo + "DDL\" id=\"Q" + QNo + "DDL\">" + builder.ToString() + "</select>";
                    }
             }

查看页面源码时生成的代码

<div id="divQ1AnswerDDL">
            <fieldset id="fsQ1DDL" style="border:;">
                <legend>
                    <label id="lblQ1AnswerDDL">Title of Drop Down List </label>
                </legend>
                <div id="divQ1AnswerDDLSub"><select runat="server" name="Q1DDL" id="Q1DDL" required="required"><option value='' title='Select'  >Select</option> <option value='IE' title='IE'  >IE</option> <option value='Safari' title='Safari'  >Safari</option> <option value='Chrome' title='Chrome'  >Chrome</option> </select></div>
            </fieldset>
        </div>

在后面的代码中

protected void btnSubmit_Click(object sender, EventArgs e)
{     
....
for (int QNo = 1; QNo < questions.Length + 1; QNo++)
        {
          ADDLRequired = (FindControl("Q" + QNo + "DDL") as     HtmlSelect).Attributes["required"] == "required" ? true: false,


}
}

(FindControl("Q" + QNo + "DDL") as HtmlSelect)

【问题讨论】:

    标签: asp.net html html-select code-behind findcontrol


    【解决方案1】:

    首先让我们从你渲染这个的错误开始

    &lt;select runat="server" name="Q1DDL" id="Q1DDL" required="required"&gt;&lt;option

    作为 HTML 页面中的字符串,错误是您期望这将被编译。不,实际上这不是编译 - 编译发生在之前,编译之后将呈现为文本 - 并且不会发生更多编译。

    所以第一步坚持这个...解决这个问题,然后解决剩下的问题。

    可能的锻炼

    渲染您喜欢的任何 html 正常控件,不使用 runat="server",然后在回发后再次渲染,并使用 Request.Form["ControlName"] 获取回发值以获取回发值

    【讨论】:

    • 感谢您指出错误。你能告诉我如何再次渲染它吗?如果我从 Page_Load 中删除 IsPostback Check,则在单击提交按钮时会再次出现渲染,但问题仍然存在
    • @shomaail 你需要了解你在那里做什么。这不是控件的动态呈现,只是文本 - 因此文本只是呈现普通控件。
    • 如果你能给我一个例子来从后面的代码中呈现控制,我将不胜感激
    • @shomaail 如果我有空闲时间,我会做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多