Нужен динамический текст заголовка Gridview из данных родительского контроля

Вот сценарий, который я пытаюсь реализовать.

У меня есть список объектов Product, каждый из которых имеет список объектов Price. Я пытаюсь отобразить эти данные с помощью DataList, где каждый элемент DataList представляет собой GridView для продукта, отображающий цены на этот продукт.

У меня все отлично работает, за исключением одного странного требования: мне нужно показывать название продукта в заголовке первого столбца каждого представления Gridview.

В SO есть множество вопросов о динамическом изменении HeaderText GridView, но эта ситуация кажется немного другой, поскольку мне нужно установить для нее значение с привязкой к данным родительского элемента управления.

Моей первой попыткой было установить текст заголовка GridView Column[0] в событии ItemCreated DataList. Это не сработало, потому что все они исчезали после обратной передачи.

Спасибо за вашу помощь!


person unnknown    schedule 21.02.2012    source источник


Ответы (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();
}

и класс продукта может выглядеть так:

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;
        }
    }
}
person ek_ny    schedule 21.02.2012
comment
... но вы можете работать над тем, чтобы получить DataItem для родителя. Это суть того, что мне нужно было сделать, и я тоже только что понял это. Спасибо за ваш пост! - person unnknown; 22.02.2012
comment
Я также не понимал, что мне нужно поле шаблона вместо BoundField - person unnknown; 22.02.2012