我正在制作一个包含用户输入组合框的向导控件。我使用TemplatedWizardStep
来控制外观和导航。我了解到在这样的步骤中访问控件需要使用FindControl(id)
。
我的向导看起来基本上是这样的,删除了大量的格式:
<asp:Wizard id="wizEntry" runat="server" >
<WizardSteps>
<asp:TemplatedWizardStep id="stepFoo" Title="Foo" runat="server" >
<table id="TableFoo" runat="server" >
<tr id="Row1">
<td id="Row1Cell1">
<asp:DropDownList id="DDListBar" runat="server" ></asp:DropDownList>
</td></tr></table></asp:TemplatedWizardStep></WizardSteps></asp:Wizard>
我想在向导DDListBar
中获取wiz
的选定值。我的研究表明,我应该在向导上调用FindControl
来获取步骤,然后在步骤中调用控件。我的代码:
DropDownList ddlBar = null;
bar = (DropDownList)wizEntry.FindControl("stepFoo").FindControl("DDListBar");
当我运行时,bar
以null
的形式返回。所以我将呼叫分成FindControl
。我确定正在找到向导步骤,但不是组合框。事实上,向导步骤中唯一的控件就是表格。
我希望这是一个我没有学过的简单解决方案,而不是嵌套控件层次结构中每个级别的FindControl。
(遗留代码使用一个长表,每行有一个组合框.C#代码文件直接通过ID引用这些组合框。但表格太长了,客户想要一个向导将数据分成小单位。)
编辑1:This answer对我目前的研究很有帮助。
答案 0 :(得分:1)
由于 DDListBar 嵌套在 TableFoo 服务器控件中,因此您需要递归地找到它。
这是一个帮助方法。它以递归方式搜索任何控件。
public static Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
return root;
return root.Controls.Cast<Control>()
.Select(c => FindControlRecursive(c, id))
.FirstOrDefault(c => c != null);
}
var ddListBar = (DropDownList)FindControlRecursive(wizEntry, "DDListBar");