Нужен динамический текст заголовка Gridview из данных родительского элемента управления
Вот сценарий, который я пытаюсь реализовать.
У меня есть список объектов Product, каждый из которых имеет список объектов Price. Я пытаюсь отобразить эти данные с помощью DataList, где каждый элемент DataList представляет собой GridView для продукта, отображающий цены для этого продукта.
У меня все отлично работает, за исключением одного странного требования: мне нужно показать название продукта в заголовке первого столбца каждого Gridview.
В SO много вопросов о динамическом изменении HeaderText GridView, но эта ситуация кажется немного другой, поскольку мне нужно установить для него значение привязки к базе данных родительского элемента управления.
Моей первой попыткой было установить текст заголовка GridView Column[0] в событии ItemCreated объекта DataList. Это не сработало, потому что все они исчезнут после обратной передачи.
Спасибо за вашу помощь!
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;
}
}
}