ASP.NET: можно ли использовать GridView для создания иерархии? - PullRequest
1 голос
/ 16 января 2009

Мы используем элементы управления GridView на некоторых страницах нашего проекта, которые мы не хотим кардинально менять, возможно ли создать иерархию в виде сетки? Может ли это быть достигнуто с помощью GridView внутри Gridview для получения отношения родитель-потомок?

Ответы [ 5 ]

5 голосов
/ 16 января 2009

да, можно, и это довольно просто ...

лучший подход - иметь несколько ObjectDataSource для того, чтобы весь процесс был для вас более легким, или, конечно, вы можете связать необработанное сеточное представление в событии 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
  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();
    }
}

надеюсь, это поможет увидеть свет в конце туннеля;)

0 голосов
/ 17 января 2009

Хорошие статьи по этому здесь который использует ASP.NET AJAX и AJAX Control Toolkit, чтобы сделать его складным.

0 голосов
/ 16 января 2009

GridView довольно статичны. Мы используем XSLT, если таблицы будут более сложными, поэтому мы имеем полный контроль над ним. В противном случае Microsoft предоставляет другие элементы управления ASP.NET, такие как DataRepeater.

0 голосов
/ 16 января 2009

Проверьте Telerik, их RadGrid имеет такие вещи из коробки (NestedHierarchy и detailtables)

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

0 голосов
/ 16 января 2009

Да, вы можете вкладывать GridView друг в друга. См. Следующую статью.

Вложение GridViews

...