簡體   English   中英

將列表綁定到ListView

[英]Bind a List to a ListView

我只是試圖創建一個列表,並從后面的代碼向其中添加元素。 每個列表元素都必須連接到后面代碼中的函數,因此我正在使用Asp:LinkBut​​ton來執行此操作。 在Default.aspx頁中,我有:

<asp:ListView ID="ulNumTenants" runat="server">
    <ItemTemplate>
        <li>
        <%# DataBinder.Eval(Container.DataItem, "XXX" ) %>
        </li>
    </ItemTemplate>
 </asp:ListView>

在后面的代碼中,我有以下內容:

var listItems = new List<LinkButton>();
int numberOfTenantsPossible = Space.MaxNumberOfTenants - (Space.MaleHousemates + Space.FemaleHousemates);
for (int itemCount = 0; itemCount < numberOfTenantsPossible; itemCount++ )
{
    LinkButton currentItem = new LinkButton();
    currentItem.CommandArgument = (itemCount + 1).ToString();
    currentItem.CommandName = "Tenant_OnClick";
    currentItem.Text = (itemCount + 1).ToString() + " tenants";
    listItems.Add(currentItem);
 }
 ulNumTenants.DataSource = listItems;
 ulNumTenants.DataBind();

我遇到的問題在於default.aspx代碼中,因為當我從數據庫中獲取條目時,我不知道應將表達式字段(“ XXX”)設置為什么。 任何建議,不勝感激。

嘗試這個:

<%# Container.DataItem  %>

我懷疑它是否會起作用,因為我認為它將僅使用LinkBut​​ton的字符串表示形式而不是HTML標記。 但是,為什么要在代碼中動態創建LinkBut​​ton? 嘗試以下方法:

背后的代碼:

public class TenantViewModel
{
   public string ID {get; set;}
   public string Name {get; set;}
}

int numberOfTenantsPossible = Space.MaxNumberOfTenants - (Space.MaleHousemates + Space.FemaleHousemates);
var vms = new List<TenantViewModel>();
for (int itemCount = 0; itemCount < numberOfTenantsPossible; itemCount++ )
{
    var vm = new TenantViewModel { ID = (itemCount + 1).ToString(), Name = (itemCount + 1).ToString() + " tenants"};
    vms.Add(vm);
}
ulNumTenants.DataSource = vms;
ulNumTenants.DataBind();

ASPX:

<asp:ListView ID="ulNumTenants" runat="server">
    <ItemTemplate>
        <li>
            <asp:LinkButton runat="server" CommandName="Tenant_OnClick" CommandArgument='<%# (Container.DataItem as TenantViewModel).ID' Text='<%# (Container.DataItem as TenantViewModel).Name' />
        </li>
    </ItemTemplate>
 </asp:ListView>

這樣一來,您可以將UI元素聲明保留在ASPX標記中,而無需在代碼中創建所有按鈕,只需創建一個視圖模型即可將其綁定到。 Container.DataItem將是一個object ,因此我們使用as語法將其轉換為正確的TenantViewModel類型,以便我們可以訪問屬性。 這樣可以使代碼更簡潔。 除了ListView,您還可以考慮綁定到Repeater。 ListView通常用於直接綁定到數據庫的兩種方式,但是我們綁定到自定義IEnumerable。

另外,如果您發現此標記明顯更干凈,則可以考慮研究ASP.NET MVC。 使用Razor語法,標記變得更加清晰,因為您不必擔心轉換為正確的類型。 無需使用轉發器,只需使用foreach循環即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM