【问题标题】:Gridview sorting not working with Item templateGridview排序不适用于项目模板
【发布时间】: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


【解决方案1】:

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

gvwSacBus_Docs.DataSource = myList;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2019-06-11
      • 2012-07-10
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多