【问题标题】:ASP.NET: Can GridView be used to create a hierarchy?ASP.NET:可以使用 GridView 创建层次结构吗?
【发布时间】:2009-01-16 08:26:24
【问题描述】:

我们在项目的某些页面中使用了 GridView 控件,我们不想大幅更改,是否可以在 gridview 中创建层次结构?这可以通过在 Gridview 中使用 GridView 来获取父子关系来实现吗?

【问题讨论】:

    标签: asp.net gridview web-controls


    【解决方案1】:

    是的,你可以,而且很简单......

    最好的方法是拥有一些ObjectDataSource,以便整个过程对您来说更容易,或者当然,您可以在paraent gridview OnRowDataBound事件中绑定嵌套的gridview,这完全取决于您:)

    示例:

    <asp:GridView ID="gvGrandFather" runat="server" DataSourceID="odsGrandFather">
        <Columns>
            <asp:BoundField DataField="myField1" HeaderText="myText1" />
            <asp:BoundField DataField="myField2" HeaderText="myText2" />
            <asp:BoundField DataField="myField3" HeaderText="myText3" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:GridView ID="gvFather" runat="server" DataSourceID="odsFather">
                        <Columns>
                            <asp:BoundField DataField="myField1" HeaderText="myText1" />
                            <asp:BoundField DataField="myField2" HeaderText="myText2" />
                            <asp:BoundField DataField="myField3" HeaderText="myText3" />
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:GridView ID="gvSon" runat="server" DataSourceID="odsSon">
                                        <Columns>
                                            <asp:BoundField DataField="myField1" HeaderText="myText1" />
                                            <asp:BoundField DataField="myField2" HeaderText="myText2" />
                                            <asp:BoundField DataField="myField3" HeaderText="myText3" />
                                        </Columns>
                                    </asp:GridView>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    
    <asp:ObjectDataSource ID="odsGrandFather" runat="server" DataObjectTypeName="Company" TypeName="CompanyDAO" SelectMethod="FindAll" />
    <asp:ObjectDataSource ID="odsFather" runat="server" DataObjectTypeName="Employees" TypeName="EmployeesDAO" SelectMethod="FindByID">
        <SelectParameters>
            <asp:Parameter Name="myFieldInCompanyObject" Type="String" />
        </SelectParameters>
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="odsSon" runat="server" DataObjectTypeName="Person"TypeName="PersonsDAO" SelectMethod="FindByID">
        <SelectParameters>
            <asp:Parameter Name="myFieldInEmployeesObject" Type="String" />
        </SelectParameters>
    </asp:ObjectDataSource>
    

    想象一下,您有像这样的 Company 对象

    Company
      Field1
      Field2
      Field3
      Employees witch is List<Person>
        Field1
        Field2
        Field3
        Person  witch is List<Person>
          Field1
          Field2
          Field3
    

    你需要做的就是每个的 DAO 并返回列表或对象本身,就像

    public class CompanyDAO
    {
        private List<Company> Companies
        {
            get
            {
                List<Company> companies = HttpContext.Current.Session["Companies"] as List<Company>;
                if (companies == null)
                    companies = new List<Company>();
                return companies;
            }
        }
        public CompanyDAO() { }
    
        [DataObjectMethod(DataObjectMethodType.Select)]
        public IEnumerable<Company> FindAll()
        {
            return this.Companies;
        }
    
        [DataObjectMethod(DataObjectMethodType.Select)]
        public IEnumerable<Company> FindByID(String CompanyID)
        {
            return (from c in this.Companies where c.ID == CompanyID select c).ToList();
        }
    }
    

    希望它有助于看到隧道尽头的曙光;)

    【讨论】:

    • 这个实现会得到父行下的子行吗?我不希望子网格与父网格在同一行,但在父行下方。
    • 如果要下,需要用到ListView,这里有一篇很棒的文章:tinyurl.com/7yzby2
    【解决方案2】:

    是的,您可以将 GridView 相互嵌套。请参阅以下文章。

    Nesting GridViews

    【讨论】:

      【解决方案3】:

      看看 Telerik,他们的 RadGrid 有这种开箱即用的东西(NestedHierarchy 和 detailtables)

      http://demos.telerik.com/aspnet-ajax/Grid/Examples/Overview/DefaultCS.aspx

      【讨论】:

        【解决方案4】:

        这方面的好文章 here 它使用 ASP.NET AJAX 和 AJAX 控件工具包使其可折叠。

        【讨论】:

          【解决方案5】:

          GridView 是相当静态的。如果表将变得更复杂,我们会使用 XSLT,因此我们可以最终控制它。否则,Microsoft 会提供其他 ASP.NET 控件,例如 DataRepeater。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-15
            • 2017-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-23
            相关资源
            最近更新 更多