2012-02-21 9 views
0

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

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

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

Существует множество вопросов о динамическом изменении 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(); 
} 

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

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; 
     } 
    } 
} 
+0

»... но вы можете работать ваш план, чтобы получить DataItem для родитель." Это суть того, что мне нужно было сделать, и я просто это понял. Спасибо за ваш пост! – unnknown

+0

Я также не понимал, что мне нужно поле шаблона вместо BoundField – unnknown

 Смежные вопросы

  • Нет связанных вопросов^_^