Ocultando columnas duplicadas en un Web dataGrid Fecha: 25/Oct/2004 (20/Oct/2004) |
ResumenEste artículo proporciona un ejemplo de como evitar que en un Web Datagrid aparezcan registros con columnas repetidas.
Descripción
Algunas ocasiones necesitamos mostrar información en un Web Datagrid donde el valor de una columna se repite para un grupo consecutivo de registros. En estos casos deseamos que la columna que se duplica solo aparezca al inicio del grupo de registros.
El siguiente ejemplo muestra un Datagrid con 2 columnas: CategoryName y ProductName tomadas de las tablas Categories y Products de la base de datos Northwind. Se muestra cada categoría de producto y los productos correspondientes sin duplicar para cada registro el nombre de la categoría.
Para probar este ejemplo debemos crear una aplicación web y copiar las siguientes líneas en la ventana de código de la página aspx. Podemos de igual forma utilizar un System.Web.UI.WebControls.Repeater en lugar de un datagrid para darle un mejor formato a la información.
El código esta realizado utilizando Visual C#.
//Esta variable almacena el nombre de la categoria actual
private string CurrentCategoryName = "";
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack) //Obtener los datos para el grid
{
//Definir la conexión
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
cn.ConnectionString = "data source=(local);integrated security=true;initial catalog=northwind";
//Configurar el data adapter
string strSQL = "Select CategoryName, ProductName from Categories, Products where Categories.Categoryid = Products.CategoryID";
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(strSQL, cn);
//Llenar el Dataset
System.Data.DataSet ds = new DataSet();
da.Fill(ds, "ProductosPorCategoria");
//Configurar el DatGrid
DataGrid dg = new DataGrid();
Page.Controls.Add(dg);
//Establecer el evento ItemDataBound que evitara que los datos se vean duplicados
dg.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid_ItemDataBound);
//Ligar el datagrid con la fuente de datos
dg.DataSource = ds;
dg.DataMember = "ProductosPorCategoria";
dg.DataBind();
}
}
//Este evento evita que la columna CategoryName se vea duplicada.
private void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (CurrentCategoryName != e.Item.Cells[0].Text) //Nueva categoria?
{
CurrentCategoryName = e.Item.Cells[0].Text; //Actualizar nueva categoria
}
else
{
e.Item.Cells[0].Text = ""; //Eliminar el texto que muestra la categoría
}
}