0

我正在制作一个包含用于用户输入的组合框的向导控件。我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:到目前为止,这个答案对我的研究很有帮助。

4

1 回答 1

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"); 
于 2016-03-21T22:35:50.773 回答