在TemplatedWizardStep中查找控件

时间:2016-03-21 20:05:40

标签: c# asp.net webforms wizard aspwizard

我正在制作一个包含用户输入组合框的向导控件。我使用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");

当我运行时,barnull的形式返回。所以我将呼叫分成FindControl。我确定正在找到向导步骤,但不是组合框。事实上,向导步骤中唯一的控件就是表格。

我希望这是一个我没有学过的简单解决方案,而不是嵌套控件层次结构中每个级别的FindControl。

(遗留代码使用一个长表,每行有一个组合框.C#代码文件直接通过ID引用这些组合框。但表格太长了,客户想要一个向导将数据分成小单位。)

编辑1:This answer对我目前的研究很有帮助。

1 个答案:

答案 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");