0

これが私が実装しようとしているシナリオです。

Product オブジェクトのリストがあり、それぞれに Price オブジェクトのリストがあります。DataList の各要素が製品の GridView であり、その製品の価格を表示する DataList を使用して、このデータを表示しようとしています。

各 Gridview の最初の列のヘッダーに製品名を表示する必要があるという奇妙な要件を除いて、すべてがうまく機能しています 。

SO には 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();
}

製品クラスは次のようになります。

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 に答える