findcontrol 不适用于动态生成的 HTMLselect
findcontrol not working for dynamically generated HTMLselect
我在 div divQ1AnswerDDLSub[ 的 innerHTML 中生成 select control(Q1DDL 和 Q2DDL) =31=] 在页面加载中
代码完美如愿生成。
但是,在我按下 SUBMIT 按钮 后,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) <== 显示为空
首先让我们从你渲染这个的错误开始
<select runat="server" name="Q1DDL" id="Q1DDL" required="required"><option
as string inside HTML page,错误在于您期望这将被编译。不,实际上这不是编译 - 编译发生在之前,编译后将呈现为文本 - 并且不会发生更多编译。
所以坚持这个作为第一步...解决这个问题,然后再解决其余的问题。
可能的锻炼
渲染任何你喜欢的 html 正常控制,没有 runat="server"
,然后在 post 返回后再次渲染它并使用 post 返回 Request.Form["ControlName"]
得到 post 返回值
我在 div divQ1AnswerDDLSub[ 的 innerHTML 中生成 select control(Q1DDL 和 Q2DDL) =31=] 在页面加载中
代码完美如愿生成。
但是,在我按下 SUBMIT 按钮 后,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) <== 显示为空
首先让我们从你渲染这个的错误开始
<select runat="server" name="Q1DDL" id="Q1DDL" required="required"><option
as string inside HTML page,错误在于您期望这将被编译。不,实际上这不是编译 - 编译发生在之前,编译后将呈现为文本 - 并且不会发生更多编译。
所以坚持这个作为第一步...解决这个问题,然后再解决其余的问题。
可能的锻炼
渲染任何你喜欢的 html 正常控制,没有 runat="server"
,然后在 post 返回后再次渲染它并使用 post 返回 Request.Form["ControlName"]
得到 post 返回值