none
Filtrar y mostrar una librería de documentos en una WebPart RRS feed

  • Pregunta

  • ¡Hola!

    Estoy desarrollando una WebPart para Sharepoint 2010. La WebPart debería obtener una Librería de Documentos, filtrar por unos de sus campos con una CAML Query y mostrarse el resultado en una vista. He probado de dos manera pero no me funciona ninguna.

    La primera es usando el control ListViewByQuery que uso para filtrar con una CAML Query. Estoy condicionado a trabajar dentro de la función RenderControl porque la WebPart está parametrizada.

    Os muestro el código:

    // Create the list view
    ListViewByQuery view = new ListViewByQuery();
          
    // Bind the view
    view.List = web.Lists["Session Documents"];
          
    // Create the query to get documents
    SPQuery query = new SPQuery(view.List.DefaultView);
    query.ViewFields = "<FieldRef Name='Name' />";
    query.Query = "<Where><Or>";
    for (int i = 0; i < sessions.Length; i++)
    {
     query.Query += "<Eq><FieldRef Name='C_x0020_Lookup_x0020_Session_x0020_Calendar' /><Value Type='Lookup'>" + sessions[i] + "</Value></Eq>";
    }
    query.Query += "</Or></Where>";
    
    // Bind the query
    view.Query = query;
    

    El problema es que la view no se muestra correctamente. He comprobado los nombre de los campos y son correctos. No se cuál es el problema.

    También he probado obteniendo los resultados con el método GetItems con la misma Query de este modo:


    SPQuery query = new SPQuery();
    query.Query = "<Where><Or>";
    for (int i = 0; i < sessions.Length; i++)
    {
     query.Query += "<Eq><FieldRef Name='C_x0020_Lookup_x0020_Session_x0020_Calendar' /><Value Type='Lookup'>" + sessions[i] + "</Value></Eq>";
    }
    query.Query += "</Or></Where>";
    SPListItemCollection results = documentsLib.GetItems(query);
    

    El problema es que no se como insertar los resultados en una vista para que se muestren en la WebPart como si fuera una Librería de Documentos normal.

    Alguien tiene alguna idea para solucionar mi problema? Cualquiera de los dos métodos de arriba me vale.

    Grácias.


    domingo, 13 de febrero de 2011 17:11

Respuestas

  • Hola Jacinto,

    creo que el problema que puedes estar teniendo es que intentas hacer un binding demasiado tarde. Me explico: si quieres tener un control (por ejemplo un GridView) asociado a un origen de datos, dicho control lo tienes que crear, configurar e incluir en la lista de controles del webpart en el método CreateChildControls(). Quizá puedas retrasar al máximo la configuración (asociar con un origen de datos) en el método PreRender().

    Si, por lo que dices, sólo puedes tocar el método RenderWebpart() lo que tienes que hacer es escribir los resultados de la consulta directamente en ese método. ¿Has mirado que realmente la consulta no te devuelva ningún resultado depurando? Lo digo porque en ese caso, después de hacer el GetItems tendrías que hacer un foreach escribiendo para cada elemento el html que necesitas.

    Saludos,
    David Martos | http://david-martos.blogspot.com | @davidmartos

    • Marcado como respuesta Marc Jordana viernes, 18 de febrero de 2011 15:10
    lunes, 14 de febrero de 2011 14:49

Todas las respuestas

  • Hola Jacinto,

    Cuando dices que no se muestran correctamente la vista, ¿te refieres a qué no te devuelve resultados o a que no se muestra como quieres? Para el primer punto, y como estás en SharePoint 2010, te aconsejo que uses LINQ To SharePoint ya que te va a facilitar mucho la realización de consultas. Para el segundo, si lo que quieres es usar la XsltListViewWePart programáticamente dale una mirada a este post:

    http://blogs.solidq.com/sharepoint/Post.aspx?ID=74&title=How%20to%20add%20or%20edit%20WebPart%20(Content%20Editor%20and%20XSLTListViewWebPart)%20to%20SharePoint%202010%20Page%20programmatically

    Saludos!

    domingo, 13 de febrero de 2011 22:50
  • Hola Jacinto,

    creo que el problema que puedes estar teniendo es que intentas hacer un binding demasiado tarde. Me explico: si quieres tener un control (por ejemplo un GridView) asociado a un origen de datos, dicho control lo tienes que crear, configurar e incluir en la lista de controles del webpart en el método CreateChildControls(). Quizá puedas retrasar al máximo la configuración (asociar con un origen de datos) en el método PreRender().

    Si, por lo que dices, sólo puedes tocar el método RenderWebpart() lo que tienes que hacer es escribir los resultados de la consulta directamente en ese método. ¿Has mirado que realmente la consulta no te devuelva ningún resultado depurando? Lo digo porque en ese caso, después de hacer el GetItems tendrías que hacer un foreach escribiendo para cada elemento el html que necesitas.

    Saludos,
    David Martos | http://david-martos.blogspot.com | @davidmartos

    • Marcado como respuesta Marc Jordana viernes, 18 de febrero de 2011 15:10
    lunes, 14 de febrero de 2011 14:49
  • Hola David,

    gracias por la respuesta. He optado por hacerlo con una ListViewByQuery en el método CreateChildControls() como dices y ha funcionado perfectamente.

    Muchísimas gracias!

    viernes, 18 de febrero de 2011 15:10