none
DropDownList que filtra datos en un GridView RRS feed

  • Pregunta

  • Hola

    Estoy intentando filtrar los datos de un gridview mediante un dropdownlist, pero no lo consigo. Este es el marcado del drop:

    <asp:DropDownList ID="DropCategorias" runat="server" ItemType="TM1.Models.cat_Categorias"

    SelectMethod="GetCategorias" DataTextField="nomCategoria" DataValueField="nomCategoria" AutoPostBack="True"> </asp:DropDownList>

    y este el método "GetCategorias"

     public IQueryable GetCategorias()
      {
         return db.Categorias;
      }

    El gridview:

    <asp:GridView ID="GridSubCat" runat="server" ItemType="TM1.Models.cat_SubCategorias" DataKeyNames="SubCategoriaID"

    SelectMethod="GetSubCategorias" AutoGenerateColumns="False" DeleteMethod="GridSubCat_DeleteItem"

    AllowSorting="true" AutoGenerateDeleteButton="True" AllowPaging="true" PageSize="6"> <Columns> <asp:DynamicField DataField="SubCategoriaID" HeaderText="ID" /> <asp:DynamicField DataField="nomSubCat" HeaderText="SUBCATEGORIA" /> <asp:DynamicField DataField="ActivaSC" HeaderText="ACTIVA"> <HeaderStyle HorizontalAlign="Center" /> <ItemStyle HorizontalAlign="Center" /> </asp:DynamicField> <asp:TemplateField HeaderText="CATEGORIA"> <ItemTemplate> <asp:Label ID="Label1" runat="server"

    Text='<%# Item.Categorias != null ? Item.Categorias.NomCategoria:"" %>'></asp:Label> </ItemTemplate> </Columns> </asp:GridView>

    el método GetSubCategorias que rellena el gridview (y se supone que lo filtra):

     public IQueryable<cat_SubCategorias> GetSubCategorias([Control] cat_Categorias DropCategorias)
      {
      
       var query = db.SubCategorias.Include(m => m.Categorias);
       if (displayCat != null)
       {
            query = query.Where(m => m.Categorias == DropCategorias);
       }
    
       return query;
      }

    y estas son las clases de entidad:

    public class cat_Categorias
     {
      [Key]
      public int CategoriaID { get; set; }
    
      [Required]
      [StringLength(40)]
      public string NomCategoria { get; set; }
    
      [StringLength(125)]
      public string TextoCategoria { get; set; }
    
      public bool Activa { get; set; }
    
      public virtual ICollection<cat_SubCategorias> SubCategorias { get; set; }
     }
     [Table("[cat.SubCategorias]")]
     public class cat_SubCategorias
     {
    
      [Key]
      public int SubCategoriaID { get; set; }
    
      [Required]
      [StringLength(40)]
      public string NomSubCat { get; set; }
    
      public int CategoriaID { get; set; }
    
      [StringLength(100)]
      public string TextoSubCat { get; set; }
    
      public bool ActivaSC { get; set; }
    
      public virtual cat_Categorias Categorias { get; set; }
    
      public virtual ICollection<cat_Productos> Productos { get; set; }
     }

    Los datos se cargan bien tanto en el drop comoen el gridview, pero no funciona el filtro.

    //Editado//

    Bien, he descubierto que para que funcione el ID del Dropdown y el nombre del parámetro en el método "GetSubcategorias" ha de ser el mismo. Ya lo he corregido, pero ahora recibo el error :

    No se puede crear un valor de constante de tipo 'TM1.Models.cat_Categorias'. Solo se admiten tipos primitivos o tipos de enumeración en este contexto.

    ¿Qué estoy haciendo mal?

    Gracias y un saludo


    • Editado Moni65 sábado, 20 de agosto de 2016 1:31 corregir errores
    viernes, 19 de agosto de 2016 22:20

Respuestas

  • Bueno, lo he solucionado. No se si es la mejor manera pero funciona.

    1. En el Dropdowlist he sustituido el DataValueField="nomCategoria" por "CategoriaID"
    2. En el método GetSubCategorias que rellena el GridView he sustituido el parámetro cat_categorias displayCat  por string displayCat.
    3. Luego he realizado las conversiones necesarias
     public IQueryable<cat_SubCategorias> GetSubCategorias([Control] string displayCat)
      {
      var query = db.SubCategorias.Include(m => m.Categorias);
      if (string.IsNullOrEmpty(displayCat))
      {
       displayCat = "0";
      }
       int idCat = Convert.ToInt32(displayCat);
    
       if (idCat > 0)
       {
        query = query.Where(s => s.CategoriaID ==idCat);
       }
       return query;
      }
    Lo dejo por si a alguién le pudiera ayudar

    • Marcado como respuesta Moni65 sábado, 20 de agosto de 2016 14:07
    sábado, 20 de agosto de 2016 14:07