0

这是我试图实现的场景。

我有一个 Product 对象列表,每个对象都有一个列表 Price 对象。我正在尝试使用 DataList 显示此数据,其中 DataList 的每个元素都是产品的 GridView,显示该产品的价格。

我的一切工作都很好,除了一个奇怪的要求: 我需要在每个 Gridview 的第一列的标题中显示产品名称。

关于动态更改 GridView 的 HeaderText 的问题有很多,但这种情况似乎有点不同,因为我需要将它设置为父控件的数据绑定值。

我的第一次尝试是在 DataList 的 ItemCreated 事件中设置 GridView Column[0] 标题文本。这不起作用,因为它们在回发后都会消失。

谢谢你的帮助!

4

1 回答 1

1

也许有一种更简单的方法——但您可以努力为父级获取 DataItem。

<asp:DataList runat="server" DataSource="<%#TheProducts %>">
    <ItemTemplate>
        <asp:GridView DataSource='<%#((Product)Container.DataItem).Prices %>' runat="server" AutoGenerateColumns="false">
            <Columns>
               <asp:TemplateField>
                    <ItemTemplate><%#((Product)((DataListItem)(((GridViewRow)Container).Parent).DataItemContainer).DataItem).Name%></ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate><%#Container.DataItem %></ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </ItemTemplate>
</asp:DataList>

后面的代码如下所示:

protected List<Product> TheProducts
{
    get { return new List<Product>
                     {
                         new Product{Name="A", Prices = new List<int>{1,2,4}},
                         new Product{Name="B", Prices = new List<int>{5,6,7}}
                     }; 
    }
}
protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack)
        this.DataBind();
}

和 Product 类可能如下所示:

public class Product
{
    public string Name { get; set; }

    private List<int> _prices = null;
    public List<int> Prices
    {
        set { this._prices = value; }
        get
        {
            if(_prices == null)
                this.Prices = new List<int>();
            return _prices;
        }
    }
}
于 2012-02-21T20:07:37.147 回答