问题描述
|
更具体地说,我希望能够将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”中的每个元素都包含该模板中所有标签的列表。