对于每个循环返回空白

时间:2013-10-02 21:10:54

标签: c# asp.net webforms aspwizard

我在asp:Wizard的最后一步中有一个for循环,它应该列出每个文本框中非空的所有文本。文本框位于asp:Wizard的第二步,它们被放置在asp:Panel个控件中,这些控件在同一步骤中使用复选框可见或不可见。这是循环事件:

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
    {
        var requested = this.Controls.OfType<TextBox>()
                         .Where(txt => !string.IsNullOrWhiteSpace(txt.Text));

        var sb = new StringBuilder();
        foreach (var textBox in requested)
        {
            sb.Append(textBox.Text); //Add the text not the textbox
            sb.Append("</br>"); //Add a line break to make it look pretty
        }
        Label1.Text = sb.ToString();

    }

如果我使用循环运行应用程序,无论我填写什么,我的标签都将返回空白。该标签目前处于第3步

<asp:WizardStep ID="WizardStep3" runat="server" AllowReturn="false" Title="Step 3" StepType="Complete">
        <asp:Label ID="Label1" runat="server" Text="This text will display when I run the application without the foreach loop"></asp:Label>
</asp:WizardStep>

2 个答案:

答案 0 :(得分:2)

  

并将它们放在asp:Panel

使用this.Controls您正在寻找直接存在于不在面板内的表单上的TextBox。

您应修改查询以从面板获取控件,如:

var requested = yourPanel.Controls.OfType<TextBox>()
                         .Where(txt => !string.IsNullOrWhiteSpace(txt.Text));

其中yourPanel是您asp:Panel

的ID

答案 1 :(得分:1)

如果控件嵌套在其他控件中,则希望以递归方式查找控件。这是辅助方法。

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 testbox = FindControlRecursive(Page, "NameOfTextBox");