如何绑定嵌套List<>中的数据?对象嵌套ListView控件?

时间:2013-06-13 15:11:03

标签: asp.net listview

所以我有一个asp.net网页,我在其中显示来自图像识别服务的一些结果。结果是OrpObject类的对象形式(名称不相关),其中包含List<>类型为Labels_texture。这些Labels_texture对象中的每一个都包含它们自己的List<>类型为Labels_color。

我想要做的是使用ListView来显示Labels_texture列表中的每个结果;然后在ListView的每个单独元素中,显示与嵌套的Labels_color List<>中的元素对应的另一个(嵌套的)ListView。在我的OrpObject中。

主要的问题是,任何时候任何一个列表中都可能存在可变数量的元素(或根本没有元素),因为它们是图像识别服务的结果。 我的主要问题是:如何绑定内部列表中的数据<>在我的OrpObject中调用Labels_color到我网页中相应的内部ListViews,在设置DataSource和为那些内部ListViews做DataBind()时没有指定数组索引?

希望我能够理解所有这一切。以下是相关的代码段:

OrpObject:

public class OrpObject
{
    public List<texture> Labels_texture { get; set; }

}

public class texture
{
    public string detector { get; set; }
    public string category { get; set; }
    public string matched_url { get; set; }
    public List<color> Labels_color { get; set; }
}

public class color
{
    public string category { get; set; }
    public string categoryID { get; set; }
    public string confidence { get; set; }
    public string matched_url { get; set; }
}

这是我的.aspx文件中的ListView代码(为了简洁而修剪)(注意:我是ASP.NET的新手,我一直盲目地将runat =“server”附加到我的LayoutTemplate中的所有内容以防万一它需要在那里。如果我不需要这一切,你能让我知道吗?)

<asp:ListView ID="ListView_Orp_Results" runat="server">
     <LayoutTemplate>
        <div id="outer_result_container" runat="server">
        <div id="itemPlaceholder" runat="server">
            <div id="result_photo" runat="server">
            </div>
            <div id="result_category" runat="server">
            </div>
            <div id="result_detector" runat="server">
            </div>
        </div>
        </div>
        <div id="inner_result_container" runat="server">
            <asp:ListView ID="ListView_inner_results" runat="server">
                <LayoutTemplate>
                <div id="outer_result_container" runat="server">
                <div id="itemPlaceholder" runat="server">
                    <div id="inner_result_photo" runat="server">
                    </div>
                    <div id="inner_result_category" runat="server">
                    </div>
                    <div id="inner_result_categoryID" runat="server">
                    </div>
                </div>
                </div>
                </LayoutTemplate>
                <ItemTemplate>
                    ...
                </ItemTemplate>
                <EmptyDataTemplate>
                    ...
                </EmptyDataTemplate>
                <EmptyItemTemplate>
                    ...
                </EmptyItemTemplate>
            </asp:ListView>
        </div>
     </LayoutTemplate>
     <ItemTemplate>
        ...
     </ItemTemplate>
     <EmptyDataTemplate>
        ...
    </EmptyDataTemplate>
    <EmptyItemTemplate>
        ...
    </EmptyItemTemplate>
</asp:ListView>

最后,这是我的代码隐藏文件的片段,我尝试将我的OrpObject和相应的列表设置为ListViews的DataSources:

ListView_Orp_Results.DataSource = myOrp.Labels_texture;
ListView_Orp_Results.DataBind();

foreach (texture myTexture in myOrp.Labels_texture)
{
    ListView_inner_results.DataSource = myTexture.Labels_color;
    ListView_inner_results.DataBind();
}

我知道这里的foreach循环可能不起作用......但是我唯一想到的就是确保为Labels_texture列表中包含的每个纹理对象生成一个嵌套的ListView ...

对小说感到抱歉,并提前感谢您提供的任何输入!

1 个答案:

答案 0 :(得分:1)

您可以将内部列表视图的数据源绑定到绑定到外部列表视图的项的属性。但是,要做到这一点,内部列表视图将在外部列表视图的项目模板中。

请参阅下面的代码,并注意内部列表视图的DataSource='<%# Eval("Labels_color") %>'属性。

<asp:ListView ID="ListView_Orp_Results" runat="server" ItemPlaceholderID="itemPlaceholder">
 <LayoutTemplate>
    <div id="outer_result_container">
        <div id="itemPlaceholder" />
    </div>
 </LayoutTemplate>
 <ItemTemplate>
     <div id="result_photo">...</div>
     <div id="result_category">...</div>
     <div id="result_detector">...</div>
     <div id="inner_result_container" runat="server">
         <asp:ListView ID="ListView_inner_results" runat="server" ItemPlaceholderID="itemPlaceholder" DataSource='<%# Eval("Labels_color") %>'>
            <LayoutTemplate>
                <div id="outer_result_container" runat="server" >
                    <div id="itemPlaceholder" runat="server"> </div>
                </div>
            </LayoutTemplate>
            <ItemTemplate>
                 <div id="inner_result_photo">...
                </div>
                <div id="inner_result_category">...
                </div>
                <div id="inner_result_categoryID">...
                </div>
            </ItemTemplate>
        </asp:ListView>
    </div>
     </div>
 </ItemTemplate>
</asp:ListView>

这样您就不需要从后面的代码中绑定嵌套的listview。 只需绑定主listview,所有内部listview将自动绑定到绑定对象的Labels_texture属性

关于runat="server"它是asp.net控件的必需属性。基本上,这个属性意味着asp.net将解析标签并创建一个相应的对象。

大多数情况下,你不需要它在html元素(div,p,...)上,但在某些情况下,你可能希望它操纵后面代码中的相应对象。