【发布时间】:2018-01-30 15:06:55
【问题描述】:
我有一个问题,希望有人能帮助我。我正在尝试对我的工作中的一个 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();
}
在网格视图中,我将创建的内容称为:
AllowSorting="true" OnSorting="gvwSacBus_Docs_Sorting">
应用使用项目模板:
<asp:TemplateField HeaderText="CONTENIDO" SortExpression="CajaContenido">
拜托了,希望有人能帮帮我
最好的问候!!
【问题讨论】:
-
嗨 VDWWD,我将列表转换为数据表以生成 gvwSacBus_Docs_Sorting(这使用数据表)。 gridview 使用项目模板
标签: asp.net gridview itemtemplate