2011-06-16 75 views
2

更具體地說,我希望能夠將我在ListView的項目模板中的標籤收集到列表中。如何從列表視圖中拉出一個項目

這是我對它的最新嘗試,可惜我仍然不足。

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

我可以通過名字分別拉動標籤,但我想拉他們,這樣我就可以擺脫硬編碼了。

+0

這是用於ASP.NET的,對吧? – rsbarro 2011-06-16 15:37:03

+0

@rsbarro是的。添加了標籤。 – Hazior 2011-06-16 18:15:32

+0

如果'ListView1.Items.Count == 0'那麼這意味着你沒有將數據綁定到'ListView1'。我在下面更新了我的答案,並且該代碼將返回每個ItemTemplate中的所有標籤的列表,這些標籤是在數據綁定到控件時創建的。你是否給這個示例代碼一個鏡頭?另外,請記住'ListView1.Items'指的是綁定模板。它是ListViewDataItem的列表,而不是這些模板中的控件。 – rsbarro 2011-06-16 20:36:59

回答

1

我想你想的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> 

編輯
建立了我前面的例子,讓我們假設ItemTemplate有多個標籤:

<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 />")); 
} 

我不確定您需要如何使用所以我沒有把它們一起列入一個清單。 myLabelCols中的每個元素都包含該模板中所有標籤的列表。

+0

啊,這意味着對於這種類型的集合,我的聲明將是錯誤的方法,我會刪除它。 – 2011-06-16 15:45:04

+0

我不是在尋找一個單一的項目。這很容易。我正在尋找一組他們。 – Hazior 2011-06-16 18:22:45

+0

@Hazior:我的例子假設你在每個ItemTemplate中都有一個Label,並且它將所有這些都帶回列表中。你是否想從一個ItemTemplate獲取多個標籤?你知道所有的ID嗎?我很樂意提供幫助,但是您能否更新問題以更具體地瞭解您所尋找的內容? – rsbarro 2011-06-16 18:30:34

相關問題