在 TemplatedWizardStep 中查找控件

Finding a control in TemplatedWizardStep

我正在制作一个包含用于用户输入的组合框的向导控件。我正在使用 TemplatedWizardStep 来控制 appea运行ce 和导航。我了解到在这样的步骤中访问控件需要使用 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>

我想在向导 wiz 中获取 DDListBar 的选定值。我的研究表明,我应该在向导上调用 FindControl 来获取步骤,然后在步骤上调用来获取控件。我的代码:

DropDownList ddlBar = null;
bar = (DropDownList)wizEntry.FindControl("stepFoo").FindControl("DDListBar");

当我运行这个的时候,bar回来了null。所以我将调用拆分为 FindControl。我确定正确找到了向导步骤,但没有找到组合框。事实上,向导步骤中唯一的控件是 table.

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

(遗留代码使用每行一个组合框的长 table。C# 代码文件直接通过 ID 引用这些组合框。但是 table 太长,客户想要一个向导将数据条目分解成小单元。)

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

由于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");