Gridview 排序不适用于项目模板

Gridview sorting not working with Item template

我有一个问题,希望有人能帮助我。我试图在我的工作中对一个数据网格视图进行排序。 该应用程序具有层,为了获取数据,数据层使用列表。 因此,为了排序,我尝试在 dataTable 中转换该列表并在 GridViewSortEventArgs 中使用它。 一个细节:我正在使用分页

这是我的代码的相关部分:

为数据定义class:

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">

拜托,希望有人能帮助我

此致问候!

为什么要将 List 转换为 DataTable?您可以将 List 绑定到 GridView。

gvwSacBus_Docs.DataSource = myList;

无论如何,如果你想对 DataTable 进行排序,你可以这样做。你必须使用 ToTable

dataTable.DefaultView.Sort = e.SortExpression + " " + SortDir;
gvwSacBus_Docs.DataSource = dataTable.DefaultView.ToTable();

我修改了我的代码并且成功了,非常感谢 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();
}