ASP.NET: ¿Se puede usar GridView para crear una jerarquía?
-
19-08-2019 - |
Pregunta
Estamos utilizando los controles GridView en algunas páginas de nuestro proyecto que no queremos cambiar drásticamente, ¿sería posible crear una jerarquía en una vista de cuadrícula? ¿Se puede lograr esto usando un GridView dentro de un Gridview para obtener la relación padre-hijo?
Solución
Sí, puede anidar GridViews uno dentro del otro. Vea el siguiente artículo.
Otros consejos
sí puedes, y es bastante fácil ...
el mejor enfoque es tener algunos ObjectDataSource para que todo el proceso sea más fácil para usted, o por supuesto, puede vincular la vista de cuadrícula en el evento OnRowDataBound de vista de cuadrícula paraentrada, todo depende de usted:)
ejemplo:
<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>
imagina que tienes el objeto de tu Compañía como
Company
Field1
Field2
Field3
Employees witch is List<Person>
Field1
Field2
Field3
Person witch is List<Person>
Field1
Field2
Field3
Todo lo que necesita hacer es el DAO para cada uno y devolver la lista o el objeto en sí como
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();
}
}
espero que ayude a ver la luz al final del túnel;)
Echa un vistazo a Telerik, su RadGrid tiene este tipo de cosas listas para usar (jerarquía anidada y tablas de detalles)
http://demos.telerik.com/aspnet -ajax / Grid / Ejemplos / Descripción general / DefaultCS.aspx
Buenos artículos sobre esto aquí que usa ASP.NET AJAX y AJAX Control Toolkit para que sea plegable.
Los GridView son bastante estáticos. Usamos XSLT si las tablas van a ser más complejas, por lo que tenemos el control final sobre ellas. De lo contrario, Microsoft proporcionará otros controles ASP.NET, como el DataRepeater.