如何从列表视图中拉出一种类型的项目

问题描述

| 更具体地说,我希望能够将ListView \的Item模板中的标签收集到一个列表中。 这是我最近的尝试,可悲的是我仍未达到目标。
foreach (Label lbl in ListView.Items.Where(r => r.ItemType == Label))
这是我的ASP控件:
<asp:ListView ID=\"ListView1\" runat=\"server\" Visible=\"false\" ItemPlaceholderID=\"phItem\"
    OnItemDataBound=\"ListView1_ItemDataBound\">
    <LayoutTemplate>
        <html>
        <head>
        </head>
        </head>
        <body>
            <table>
                <asp:PlaceHolder ID=\"phItem\" runat=\"server\" />
            </table>
        </body>
        </html>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <asp:Label ID=\"lblChecklist\" runat=\"server\" />
            </td>
            <td>
                <asp:Label ID=\"lblCompliant\" runat=\"server\" />
            </td>
            <td>
                <asp:Label ID=\"lblNonCompliant\" runat=\"server\" />
            </td>
            <td>
                <asp:Label ID=\"lblNotApplicable\" runat=\"server\" />
            </td>
            <td>
                <asp:Label ID=\"lblNotComplete\" runat=\"server\" />
            </td>
            <td>
                <asp:Label ID=\"lblTotal\" runat=\"server\" />
            </td>
        </tr>
    </ItemTemplate>
    <EmptyDataTemplate>
        There are not results that match your input paramaters.
    </EmptyDataTemplate>
</asp:ListView>
我一直在寻找拉标签方法,现在当我在运行时查看ListView1.Items时,我发现ListView1.Items.Count = 0。 我可以按标签名称分别拉标签,但是我想拉标签,这样我就可以摆脱对其进行硬编码的麻烦。     

解决方法

        我认为您想要的LINQ语句类似于:
var myLabels = listView1.Items
    .Where(i => i.ItemType == ListViewItemType.DataItem)
    .Select(a => a.FindControl(\"myLabel\"));
您想在每个项目上使用
FindControl
来获得在
ItemTemplate
中添加的
Label
控件。请记住,
Items
只是
ListViewDataItems
的列表,因此即使模板中仅有标签,也无法从中选择标签。 这是我一起提出的完整的工作示例。
<%@ Page Language=\"C#\" AutoEventWireup=\"true\" %>
<html>
<body>
    <form id=\"form1\" runat=\"server\">
        <asp:ListView ID=\"listView1\" runat=\"server\">
            <ItemTemplate>
                <asp:Label ID=\"myLabel\" Text=\"<%# Container.DataItem %>\" runat=\"server\" /><br />
            </ItemTemplate>
        </asp:ListView>
        <asp:Button ID=\"btnGatherLabels\" Text=\"Gather Labels\" OnClick=\"btnGatherLabels_Click\" runat=\"server\" />
    </form>
</body>
</html>
<script runat=\"server\">
    protected void Page_Load(object sender,EventArgs e)
    {
        if(!Page.IsPostBack)
        {
            var myItems = new[] { \"item1\",\"item2\",\"item3\" };
            listView1.DataSource = myItems;
            listView1.DataBind();
        }
    }

    public void btnGatherLabels_Click(object sender,EventArgs e)
    {
        var myLabels = listView1.Items
                        .Where(i => i.ItemType == ListViewItemType.DataItem)
                        .Select(a => a.FindControl(\"myLabel\"));
        foreach(Label myLabel in myLabels)
            Response.Write(string.Concat(myLabel.Text,\"<br />\"));
    }
</script>
编辑 以我前面的示例为基础,假设ѭ5具有多个标签:
<ItemTemplate>
    <asp:Label ID=\"myLabel1\" Text=\"Label Here:\" runat=\"server\" /> 
    <asp:Label ID=\"myLabel2\" Text=\"<%# Container.DataItem %>\" runat=\"server\" /> 
    <asp:TextBox ID=\"filler\" runat=\"server\" /><br />
</ItemTemplate>
以下代码将带回并显示每个模板中每个标签的文本:
public void btnGatherLabels_Click(object sender,EventArgs e)
{
    var myLabelCols = listView1.Items
        .Where(i => i.ItemType == ListViewItemType.DataItem)
        .Select(a => 
            a.Controls.Cast<Control>()
                .Where(b => b.GetType().Equals(typeof(Label)))
        );
    foreach (var myLabels in myLabelCols)
        foreach (Label myLabel in myLabels)
            Response.Write(string.Concat(myLabel.Text,\"<br />\"));
}
我不确定您需要如何使用这些数据,因此我没有将它们合并到一个列表中。 “ѭ12”中的每个元素都包含该模板中所有标签的列表。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...