Нужен динамический текст заголовка Gridview из данных родительского элемента управления - PullRequest
0 голосов
/ 21 февраля 2012

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

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

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

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

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

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

1 Ответ

1 голос
/ 22 февраля 2012

Может быть, есть более простой способ - но вы можете потрудиться, чтобы получить 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;
        }
    }
}
...