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





Да, вы можете вкладывать GridView друг в друга. См. Следующую статью.
GridView довольно статичны. Мы используем XSLT, если таблицы будут более сложными, поэтому у нас есть полный контроль над ними. В противном случае Microsoft предоставляет другие элементы управления ASP.NET, такие как DataRepeater.
Обратите внимание на Telerik, их RadGrid имеет такие вещи из коробки (вложенная иерархия и подробные таблицы)
http://demos.telerik.com/aspnet-ajax/Grid/Examples/Overview/DefaultCS.aspx
да, можно, и это довольно просто ...
лучший подход - иметь несколько объектов ObjectDataSource, чтобы весь процесс был проще для вас, или, конечно, вы можете привязать nasted gridview к параентному событию gridview OnRowDataBound, все зависит от вас :)
пример:
<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();
}
}
надеюсь, это поможет увидеть свет в конце туннеля;)
если вы хотите под, вам нужно использовать ListView, здесь есть отличная статья: tinyurl.com/7yzby2
Хорошие статьи по этому поводу здесь который использует ASP.NET AJAX и AJAX Control Toolkit, чтобы сделать его сворачиваемым.
Получит ли эта реализация дочернюю строку под родительской строкой? Я не хочу, чтобы дочерняя сетка находилась в той же строке, что и родительская, но под родительской строкой.