如何在主详细信息页面中获取页面控件?

时间:2009-12-21 15:08:28

标签: c# .net controls master-detail

我有母版页及其内容页面。我想让内容页面上的文本框。如何在内容页面后面的C#代码中获取它们?

1 个答案:

答案 0 :(得分:0)

使用它的ID访问它:

标记:

<asp:TextBox runat="server" ID="myTextBox"></asp:TextBox>

代码背后:

myTextBox.Text = "This is a text!";

注意您需要添加runat="server"才能访问它。

修改
在您发表评论后,我想我明白您的目标。您需要遍历控制树中的所有控件以查找所有TextBox。

这是一个递归实现:

public List<Control> FindControls(Control root, Type type)
{
    var controls = new List<Control>();

    foreach (Control ctrl in root.Controls)
    {
        if (ctrl.GetType() == type)
            controls.Add(ctrl);

        if (ctrl.Controls.Count > 0)
            controls.AddRange(FindControls(ctrl, type));
    }

    return controls;
}

要获取页面中的所有TextBox,您将使用Page作为根控件来调用它:

var allTextBoxes = FindControls(Page, typeof(TextBox));

上面的例子是为了澄清你应该如何进行的想法。我使用扩展方法有点不同:

public static class ExtensionMethods
{
    public static IEnumerable<Control> FindControls(this Control root)
    {
        foreach (Control ctrl in root.Controls)
        {
            yield return ctrl;
            foreach (Control desc in ctrl.FindControls())
                yield return desc;
        }

    }
}

现在你可以直接在任何控件上使用它,甚至在结果上应用Linq,因为它是IEnumerable。

这将为您提供页面中所有控件的数组:

var allControls = this.FindControls().ToArray();

获取所有TextBox控件的数组:

var allTextBoxes = this.FindControls()
                       .OfType<TextBox>().ToLArray<TextBox>();

并获取具有特定ID的TextBox的列表:

var myTextBox = this.FindControls()
                    .OfType<TextBox>()
                    .Where<TextBox>(tb => tb.ID.Equals("textBox1")).ToList<TextBox>();

您也可以在foreach语句中使用它:

foreach (Control c in this.FindControls())
{
  ...
}