我有问题,请希望有人能帮助我。我正在尝试在我的工作中对一个datagridview进行排序。 该应用程序具有图层,数据层使用列表获取数据。 因此,为了排序,我尝试在dataTable中转换该列表并在GridViewSortEventArgs中使用它。 一个细节:我正在使用分页
这是我的代码的相关部分:
定义数据类:
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;
}
}
在数据层中,这是针对查询的:
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;
}
用于获取网格上的数据我称之为
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);
}
}
现在进行排序我得到了这个:
public SortDirection dir
{
get
{
if (ViewState["CajaContenido"] == null)
{
ViewState["CajaContenido"] = SortDirection.Ascending;
}
return (SortDirection)ViewState["CajaContenido"];
}
set
{
ViewState["CajaContenido"] = value;
}
}
我将数据转换为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;
}
}
因此,当我尝试进行排序时,我会使用
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();
}
在gridview中,我称之为我创建的内容:
AllowSorting="true" OnSorting="gvwSacBus_Docs_Sorting">
该应用使用了商品模板:
<asp:TemplateField HeaderText="CONTENIDO" SortExpression="CajaContenido">
拜托,我希望有人可以帮助我
最好的问候!!
答案 0 :(得分:0)
为什么要将List
转换为DataTable
?您可以将List绑定到GridView。
gvwSacBus_Docs.DataSource = myList;
无论如何,如果你想对DataTable进行排序,你就是这样做的。您必须使用ToTable
dataTable.DefaultView.Sort = e.SortExpression + " " + SortDir;
gvwSacBus_Docs.DataSource = dataTable.DefaultView.ToTable();
答案 1 :(得分:0)
我改变了我的代码并且工作正常,非常感谢VDWWD
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();
//convertir list to datatable
ListtoDataTable lsttodt = new ListtoDataTable();
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";
}
databito.DefaultView.Sort = e.SortExpression + " " + SortDir;
gvwSacBus_Docs.DataSource = databito.DefaultView.ToTable();
gvwSacBus_Docs.DataBind();
}