Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/07/2008, 06:28
mariuciber
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Ayuda Ordenar un GridView

Ya di con la solucion. Tuve que crear una clase para pasar de Collection.Generic.List a una DataSet....

Aqui va el Codigo:

public class CommonWebControls
{
/// <summary>
/// Convierte una coleccion de elementos dada en un objeto de negocio a un DataSet.
/// Toma como entrada un objeto de negocio que contiene la colección de elementos que vamos a mostrar
/// en un determinado control web y busca esa coleccón a la vez que crea las columnas, filas y finalmente
/// la tabla que formarán parte del DataSet que devuelve.
/// La finalidad de este procedimiento es que todos los controles web que tengan como entrada de datos su
/// propiedad DataSource reciban un DataSet y no se tengan que preocupar por donde buscar la coleccion
/// que deben mostrar en el control.
/// </summary>
/// <param name="obj">Objeto de negocio con la coleccion delementos a mostrar</param>
/// <returns>DataSet con la coleccion</returns>
public static DataSet ConvertToDataSet(object obj)
{
List<AbsentismoCurso> propertyList = null;
ArrayList propertyList2 = null;
DataSet ds = new DataSet();
DataTable dt = new DataTable();
object[,] values = null;
int count = 0;

IEnumerator en;
int rowCount = 0;
int propertyCount = 0;

// lista de propiedades del objeto de negocio que queremos que formen parte del DataSet
try
{
propertyList = (List<AbsentismoCurso>)obj;
en = propertyList.GetEnumerator();
}
catch
{
propertyList2 = (ArrayList)obj;
en = propertyList2.GetEnumerator();
}

Type tp;

// La primera vez que recorremos las propiedades creamos las columnas de la tabla
bool fillColumnsHeaders = true;
while (en.MoveNext())
{
tp = en.Current.GetType();
if (fillColumnsHeaders)
{
foreach (PropertyInfo pI in tp.GetProperties())
{
dt.Columns.Add(pI.Name);
count++;
}
try
{
values = new object[((List<AbsentismoCurso>)obj).Count, count];
}
catch
{
try
{
values = new object[((ArrayList)obj).Count, count];
}
catch
{
return null;
}
}

fillColumnsHeaders = false;
}

propertyCount = 0;
// recogemos el valor de cada propiedad en un vector
foreach (PropertyInfo pI in tp.GetProperties())
{
values[rowCount, propertyCount] = pI.GetValue(en.Current, null);
propertyCount++;
}
rowCount++;
}
object[] objArray = new object[propertyCount];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < propertyCount; j++)
{
objArray[j] = values[i, j];
}
dt.Rows.Add((object[])objArray);
}
ds.Tables.Add(dt);
return ds;
}

}


Luego en el ASPX:

private string GridSampleSortDirection
{
get { return ViewState["SortDirection"] as string ?? "ASC"; }
set { ViewState["SortDirection"] = value; }
}

private string GridSampleSortExpression
{
get { return ViewState["SortExpression"] as string ?? "Nombre"; }
set { ViewState["SortExpression"] = value; }
}

private string getSortDirection()
{
switch (GridSampleSortDirection)
{
case "ASC":
GridSampleSortDirection = "DESC";
break;
case "DESC":
GridSampleSortDirection = "ASC";
break;
}
return GridSampleSortDirection;
}
/// <summary>
/// Funcion del GridView para ordenar la informacion segun el encabezado
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void grdAbsentismo_Sorting(object sender, GridViewSortEventArgs e)
{
List<AbsentismoCurso> listaObtenida = new List<AbsentismoCurso>();
listaObtenida = controlador.ListaAbsentismoCurso;
DataView s = new DataView(CommonWebControls.ConvertToDataSet(listaO btenida).Tables[0]);

GridSampleSortExpression = e.SortExpression;
int pageIndex = grdAbsentismo.PageIndex;
grdAbsentismo.DataSource = sortDataView(s, false);
grdAbsentismo.DataBind();
grdAbsentismo.PageIndex = pageIndex;
}

/// <summary>
/// Funcion del GridView para pasar a la siguiente pagina
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void grdAbsentismo_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
List<AbsentismoCurso> listaObtenida = new List<AbsentismoCurso>();
listaObtenida = controlador.ListaAbsentismoCurso;
DataView s = new DataView(CommonWebControls.ConvertToDataSet(listaO btenida).Tables[0]);
return s;

int pageIndex = grdAbsentismo.PageIndex;
grdAbsentismo.DataSource = sortDataView(s, true);
grdAbsentismo.PageIndex = e.NewPageIndex;
grdAbsentismo.DataBind();
}

/// <summary>
/// Funcion para ordenar la lista
/// </summary>
/// <param name="dataView"></param>
/// <param name="isPageIndexChanging"></param>
/// <returns></returns>
protected DataView sortDataView(DataView dataView, bool isPageIndexChanging)
{
if (isPageIndexChanging)
{
dataView.Sort = string.Format("{0} {1}", GridSampleSortExpression, GridSampleSortDirection);
}
else
{
dataView.Sort = string.Format("{0} {1}", GridSampleSortExpression, getSortDirection());
}
return dataView;
}


Espero que les sirva.