I have a problem, please I hope anyone can help me. I'm trying to sort one datagridview in my job. The app has layers and for get data the data layer uses lists. So, for sorting I try to convert that list in dataTable and using it in GridViewSortEventArgs. One detail: I'm using paging
this is relevant part of my code:
Define class for the data:
public class Cajas
{
public Cajas()
{ }
private string clienteCodigo;
public string ClienteCodigo
{
get { return clienteCodigo; }
set { clienteCodigo = value; }
}
//-------------------------------
private string cajaCodigo;
public string CajaCodigo
{
get { return cajaCodigo; }
set { cajaCodigo = value; }
}
//-------------------------------
private int cajaNumero;
public int CajaNumero
{
get { return cajaNumero; }
set { cajaNumero = value; }
}
//-------------------------------
private string cajaContenido;
public string CajaContenido
{
get { return cajaContenido; }
set { cajaContenido = value; }
}
//-------------------------------
private DateTime fecEmisionDoc;
public DateTime FecEmisionDoc
{
get { return fecEmisionDoc; }
set { fecEmisionDoc = value; }
}
public Cajas(string cliCod, string cajCod, int cajNum, string cajCon, DateTime fecEmi)
{
this.ClienteCodigo = cliCod;
this.CajaCodigo = cajCod;
this.CajaNumero = cajNum;
this.CajaContenido = cajCon;
this.FecEmisionDoc = fecEmi;
}
}
In the data layer this is for the query:
public List<Cajas> Cajas_Buscar_CajaXCont(string clienteCodigo, string cajaContenido)
{
List<Cajas> ListCajasxContenido = new List<Cajas>();
string storedProcedure = "CAJAS_BUSCAR_CAJAXCONT";
using (DbConnection con = dpf.CreateConnection())
{
con.ConnectionString = conStr;
using (DbCommand cmd = dpf.CreateCommand())
{
cmd.Connection = con;
cmd.CommandText = storedProcedure;
cmd.CommandType = CommandType.StoredProcedure;
DbParameter param1 = cmd.CreateParameter();
param1.DbType = DbType.String;
param1.ParameterName = "CLIENTE_CODIGO";
param1.Value = clienteCodigo;
cmd.Parameters.Add(param1);
DbParameter param2 = cmd.CreateParameter();
param2.DbType = DbType.String;
param2.ParameterName = "CONTENIDO_CAJA";
param2.Value = cajaContenido;
cmd.Parameters.Add(param2);
con.Open();
using (DbDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
try
{
//creamos un objeto de tipo Caja, y por c/ registro encontrado en la db, insertamos
Cajas cajaBus = new Cajas();
cajaBus.ClienteCodigo = dr["CLIENTE"].ToString();
cajaBus.CajaCodigo = dr["CODIGO CAJA"].ToString();
cajaBus.CajaNumero = Convert.ToInt16(dr["NUM"].ToString());
cajaBus.CajaContenido = dr["CONTENIDO"].ToString();
if (Convert.IsDBNull(dr["F.EMI"].ToString())) //para manejar los valores DBnull
{
cajaBus.FecEmisionDoc = Convert.ToDateTime("9999-01-01"); //de lo contrario c# no los podra interpretar
}
else
{
cajaBus.FecEmisionDoc = Convert.ToDateTime(dr["F.EMI"]);
}
ListCajasxContenido.Add(cajaBus);
}
catch (System.InvalidCastException)
{ }
catch (System.FormatException)
{ }
}
}
}
}
return ListCajasxContenido;
}
for get data on grid I call it
protected void sacbus_Consul_Cajas_x_Cont()
{
gvwSacBus_Docs.DataSource = null;
gvwSacBus_Docs.DataBind();
gvwSacBus_Docs.DataSource = cajaBL.sacbus_Consul_Cajas_x_Cont(lbl_SacBus_CliCod.Text,
txt_SacBus_Criter.Text);
gvwSacBus_Docs.DataBind();
if (gvwSacBus_Docs.Rows.Count == 0)
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "AlertScript", "alert('No Encontrado!');", true);
}
}
Now for sorting I get this:
public SortDirection dir
{
get
{
if (ViewState["CajaContenido"] == null)
{
ViewState["CajaContenido"] = SortDirection.Ascending;
}
return (SortDirection)ViewState["CajaContenido"];
}
set
{
ViewState["CajaContenido"] = value;
}
}
I convert the data to Datatable
public class ListtoDataTable
{
public DataTable ToDataTable<T>(List<T> items)
{
DataTable dataTable = new DataTable(typeof(T).Name);
//Get all the properties by using reflection
PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo prop in Props)
{
dataTable.Columns.Add(prop.Name); //Setting column names as Property names
}
foreach (T item in items)
{
var values = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
{
values[i] = Props[i].GetValue(item, null);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
}
So, when I try to make the sorting I use:
protected void gvwSacBus_Docs_Sorting(object sender, GridViewSortEventArgs e)
{
gvwSacBus_Docs.DataSource = cajaBL.sacbus_Consul_Cajas_x_Cont(lbl_SacBus_CliCod.Text,
txt_SacBus_Criter.Text);
gvwSacBus_Docs.DataBind();
ListtoDataTable lsttodt = new ListtoDataTable(); //convert list to datatable
databito = lsttodt.ToDataTable(cajaBL.sacbus_Consul_Cajas_x_Cont(lbl_SacBus_CliCod.Text,
txt_SacBus_Criter.Text));
string SortDir = string.Empty;
if (dir == SortDirection.Ascending)
{
dir = SortDirection.Descending;
SortDir = "Desc";
}
else
{
dir = SortDirection.Ascending;
SortDir = "Asc";
}
DataView sortedView = new DataView(databito);
sortedView.Sort = e.SortExpression + " " + SortDir;
gvwSacBus_Docs.DataSource = sortedView;
gvwSacBus_Docs.DataSource = cajaBL.sacbus_Consul_Cajas_x_Cont(lbl_SacBus_CliCod.Text,
txt_SacBus_Criter.Text);
gvwSacBus_Docs.DataBind();
}
In the gridview I call what i've created:
AllowSorting="true" OnSorting="gvwSacBus_Docs_Sorting">
the app uses Item templates:
<asp:TemplateField HeaderText="CONTENIDO" SortExpression="CajaContenido">
Please, I hope anyone can help me
best regards!!
Why are you converting a List
to a DataTable
? You can bind List to a GridView.
gvwSacBus_Docs.DataSource = myList;
Anyway if you want to sort a DataTable you do it like this. You have to use ToTable
dataTable.DefaultView.Sort = e.SortExpression + " " + SortDir;
gvwSacBus_Docs.DataSource = dataTable.DefaultView.ToTable();