【问题标题】:How can I bind data from nested List<> objects to nested ListView controls?如何将嵌套 List<> 对象中的数据绑定到嵌套 ListView 控件?
【发布时间】:2013-06-13 15:11:02
【问题描述】:

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

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

主要问题是,任何时候这些列表中都可能有可变数量的元素(或根本没有),因为它们是图像识别服务的结果。 我的主要问题是:如何将 OrpObject 中名为 Labels_color 的内部 List 中的数据绑定到网页中相应的内部 ListViews,而无需在设置 DataSource 并为那些执行 DataBind() 时指定数组索引内部 ListViews?

希望我能够理解这一切。以下是相关代码sn-ps:

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>

最后,这是我的代码隐藏文件中的 sn-p,我尝试将 OrpObject 和相应的列表设置为 ListViews 的数据源:

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...

对这部小说感到抱歉,提前感谢您提供的任何意见!

【问题讨论】:

    标签: asp.net listview


    【解决方案1】:

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

    查看下面的代码并注意内部列表视图的DataSource='&lt;%# Eval("Labels_color") %&gt;' 属性。

    <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都会自动绑定到绑定对象的Labels_texture属性

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

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

    【讨论】:

    • 哇,我想这会花上很长时间。非常感谢,这有效!并感谢有关 runat="server" 的建议!
    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多