1

我想知道我是否可以在后面的代码中创建一个标签数组。然后,如果我可以将 .aspx 中的标签放入带有 id 的标签数组中并用它来操作它。

谢谢

4

3 回答 3

3

页面看起来像这样:

<body>
<form id="form1" runat="server">
<div id="labelSpace" runat="server">

<asp:Label ID="Label1" runat="server" Text="Label" Visible="false" >Label One</asp:Label><br />
<asp:Label ID="Label2" runat="server" Text="Label">Label Two</asp:Label><br />
<asp:Label ID="Label3" runat="server" Text="Label">Label Three</asp:Label><br />
<asp:Label ID="Label4" runat="server" Text="Label" Visible="false">Label Four</asp:Label></div><br />

<asp:Button ID="Button1" runat="server" Text="PostBack and Change Labels" />

</form>

这将为您提供一个包含所有标签的数组,<div id="labelSpace">并且没有其他控件:

  protected void Page_Load(object sender, EventArgs e)
    {

        if (IsPostBack)//This will only fire after button is clicked...
        {
            //This does [just as you ask] provide you with an array of labels
            Label[] labels = this.labelSpace.Controls.OfType<Label>().ToArray<Label>();
            //& Allows you to manipulate a label in the code behind 
            // by addressing it's index value;
            labels[2].Text = "Modified In Code Behind";


            //Something you may find more useful than an array is getting 
            // a list of labels like:
            List<Label> listOfLabels = this.labelSpace.Controls.OfType<Label>().ToList<Label>();


            //with a list you can identify an individual label easily like:
            IEnumerable<Label> invisibleLabels = listOfLabels.Where(l => l.Visible == false);
            //with an 'IEnemerable of invisible labels you can now manipulate those to make them all visible...
            foreach (Label l in invisibleLabels)
            {
                l.Visible = true;
                l.Text = "Made Visible";
            }

            //or, if you just want a single label where the id is "Label2"
            var labelThree = labels.Where(p => p.ID == "Label2").First();
            labelThree.Text = "selected by label id and then edited";
        }
    }

如果您想从页面级别开始,您将需要构建一个递归例程来钻取子控件以创建 masterControlCollection,然后调用".OfType<T>..."

一旦你走到这一步,你就可以使用 LINQ 根据你想要的任何属性来选择一个特定的标签或一组标签。

于 2011-04-24T05:13:15.917 回答
2

是的你可以。来自 .aspx 部分的标签将在代码隐藏文件中具有相应的对象。它们没有什么特别之处,它们就像任何其他 .NET 对象一样。例如,如果您的标记看起来像这样

<asp:Label runat="server" id="MyLabl1" Text="Some Text 1" />
<asp:Label runat="server" id="MyLabl2" Text="Some Text 2" />
<asp:Label runat="server" id="MyLabl3" Text="Some Text 3" />
<asp:Label runat="server" id="MyLabl4" Text="Some Text 4" />

代码隐藏文件将具有类似

protected global::System.Web.UI.WebControls.Label MyLabl1;
protected global::System.Web.UI.WebControls.Label MyLabl2;
protected global::System.Web.UI.WebControls.Label MyLabl3;
protected global::System.Web.UI.WebControls.Label MyLabl4;

根据您的项目的设置方式,这可能位于 .cs 文件或 .designer.cs 文件中。从那里开始,没有什么能阻止您将它们添加到数组中并从那里使用它们。

例如

var labels = new Label[] { MyLabl1, MyLabl2, MyLabl3, MyLabl4 };

将创建一个labels带有 4 个标签的数组,然后你可以对它们做任何你想做的事情。然后你可以做labels[0]第一个,等等。这是你的想法吗?

于 2011-04-24T05:12:03.553 回答
0

Label[] labels = new Label[10];
labels[0] = new Label();
labels[0].Text = "blablabla";
...

labels[9] = new Label();
labels[9].Text = "blablabla";

于 2011-04-24T02:21:37.687 回答