none
Mostrar campos de listas en una web part y colocarlo en una pagina .aspx RRS feed

  • Pregunta

  • Hola!! Necesito un poco de ayuda, ya que soy nuevo en esto y me es complicado. Tengo un ejercicio y en uno de los puntos me dice que:

    Tengo que crear un WebPart que muestre todos los registros de cambio asociado a una lista cuyo ID viene por parámetro en un QueryString y colocarlo en una pagina .aspx.

    Espero su ayuda!

    Gracias!!
    miércoles, 14 de noviembre de 2012 15:08

Respuestas

  • Hola Dante!!

    En primer lugar lo ponerlo en una pagina .aspx es el crearte una pagina dentro de sitio de Sharepoint y listo.

    Para hacer el Webpart utiliza el visual Studio 2010 y utilizas la plantilla de Webpart Visual, en el ascx te montas el aspecto que quieres visualizar( tablas, campos, etc.)

    y en la parte del codigo te valdia con añadir las siguientes lineas de codigo

          string id=   Request.QueryString["id"];
                if (!string.IsNullOrEmpty(id))
                {
                    SPListItem item = SPContext.Current.Web.Lists["Lista"].GetItemById(Convert.ToInt32(id));
                    txtCampo1.Text = item["Campo1"].ToString();
                }
              
    

    Si tienes cualquier duda ya comentas.

    Un saludo

    miércoles, 14 de noviembre de 2012 15:14

Todas las respuestas

  • Hola Dante!!

    En primer lugar lo ponerlo en una pagina .aspx es el crearte una pagina dentro de sitio de Sharepoint y listo.

    Para hacer el Webpart utiliza el visual Studio 2010 y utilizas la plantilla de Webpart Visual, en el ascx te montas el aspecto que quieres visualizar( tablas, campos, etc.)

    y en la parte del codigo te valdia con añadir las siguientes lineas de codigo

          string id=   Request.QueryString["id"];
                if (!string.IsNullOrEmpty(id))
                {
                    SPListItem item = SPContext.Current.Web.Lists["Lista"].GetItemById(Convert.ToInt32(id));
                    txtCampo1.Text = item["Campo1"].ToString();
                }
              
    

    Si tienes cualquier duda ya comentas.

    Un saludo

    miércoles, 14 de noviembre de 2012 15:14
  • Hola, muchas gracias por responder! No me funciona lamentablemente, me debe estar faltando algo. El código va en el evento page_load del ascx.cs?
    miércoles, 14 de noviembre de 2012 18:08
  • Efectivamente y como buena practica de codigo lo que haria seria añadir el codigo que te he puesto anteriormente en una función y en el evento Page_load llamar a esta funcion siempre que se cargue la pagina por primera vez
    if (!page.ispostback)
    {
     LoadData();
    }
    
    Ya comentas Un saludo
    jueves, 15 de noviembre de 2012 8:40
  • Sisi, eso fue lo que hice! Pero tengo el problema que el id del queryString me devuelve "null" :S
    Gracias!!
    jueves, 15 de noviembre de 2012 15:17
  • Hola Dante_s10,

    Lo que tienes que hacer es que ese parametro lo tienes que poner arriba en la direccion por ejemplo si tu dirección es http://sharepoint/default.aspx le tienes que añadir http://sharepoint/default.aspx&id=1

    Otra cosa seria que quieras poner ese id en la url que para ello tendrias que saber desde donde lo quieres llamar y  mas cosas sobre la especificación.

    Un saludo.

    jueves, 15 de noviembre de 2012 15:40
  • Muchas gracias! Ahora bien, tengo que mostrar los registros de una lista asociados a "tal campo" de otra cuyo id es ese que viene por parámetro en el queryString.  Cómo se hace para asociar que ese campo sea igual al de la otra lista para mostrar los registros de esta última?

    Gracias!!

    jueves, 15 de noviembre de 2012 15:56
  • Para hacer eso te valdria con un codigo semejante al siguiente, para hacer la consulta yo lo hago realizando consultas CAML que es lo mas comodo (para mi) tambien se puede utilizar usando Linq To Sharepoint.

    Lo que hace es este codigo en primer lugar es obtener el nombre por el que tienes que buscar en la lista origen, con es nombre realzias la busqueda CAML en la lista destino y con los datos que obtienes ya lo pintas de la forma en la que tu quieras (de la misma forma que en el ejemplo de arriba)

     private void ObtenerDatosVinculados(int id)
            {
                string nombre = SPContext.Current.Web.Lists["ListaOrigen"].GetItemById(id)["Nombre"].ToString();
    
                SPQuery query = new SPQuery();
                query.Query = string.Format(@"<Where>
                                                    <Eq>
                                                        <FieldRef Name='CampoVinculadoListaOrigen' />
                                                        <Value Type='Lookup'>{0}</Value>
                                                    </Eq>
                                              </Where>",
                                            nombre);
                foreach(SPListItem item in SPContext.Current.Web.Lists["ListaDestina"].GetItems(query))
                {
                    ////muesto los datos tal  y como el otro ejemplo
                }
            }

    jueves, 15 de noviembre de 2012 16:24
  • Hola adrián! Sabes que en el foreach el "item" es null. Tenes idea qué me puede estar pasando? Porque tengo un registro de cambio para mostrar.
    lunes, 19 de noviembre de 2012 14:04
  • Hola Dante_s10,

    Lo que creo que te debe estar pasando es que la Query que le estas pasando no es correcta y por eso no te devuelve ningun registro.

    Si has seguido la consulta que te he puesto yo puede ser debido a que el campo  de la lista lo tenga mal escrito (que no sea el interno) para comprobar su funcionamiento lo que puedes hacer es no pasarle la query y ver que te entra en el foreach.

    Ya comentas

    lunes, 19 de noviembre de 2012 14:44
  • Ya lo solucione! Gracias! Pero ahora solo me devuelve el ultimo registro modificado! Y yo al item de la otra lista le hice 2 modificaciones, por lo tanto me tendria que devolver 2 registros, y no solo el último:

                foreach (SPListItem item in SPContext.Current.Web.Lists["LogCambioResponsable"].GetItems(query))
                {
                    txtCampo1.Text = item["Fecha"].ToString();

                    txtCampo2.Text = item["Responsable"].ToString();

                    txtCampo3.Text = item["Usuario"].ToString();

                }

    Si en vez de SpListItem pongo SPListItemCollection, para que me devuelve una colección de los items? Pruebo pero no me anda.

    lunes, 19 de noviembre de 2012 14:53
  • 

    Hola Dante,

    El SPListItemCollection es la colección de todos los items, por eso no te funciona ya que tienes que iterar item a item.

    El fallo lo tienes en la Query que le estas pasando, indica la consulta que estas pasando y te intento ayudar.

    Saludos

    lunes, 19 de noviembre de 2012 15:12
  • Claro, y cómo hago para iterar item a item entonces? Para que la web part me muestre todos los registros de cambio y no solo el ultimo.

    La Query la tengo bien! Gracias!

    lunes, 19 de noviembre de 2012 15:24
  • Dante el foreach que te puse indica que te itera todos los elementos que te devuelve la Query, de hay que si solo te devuelve un registro es que tengas la query mal echa.

    Para comprobar la query puedes utilizar otros programas como el 2UCamlQuery o este que explica Raul Gilaber en este post

    Ya comentas

    lunes, 19 de noviembre de 2012 15:43
  • Es verdad, me devuelve mas de un registro, pero solo me muestra el ultimo, debe ser porque lo estoy mostrando en un textbox?

    Para la Query utilice un CustomAction:

    El Elements.xml del custom es:

    <?xml version="1.0" encoding="utf-8"?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
     
      <CustomAction
       Location="ScriptLink"
       ScriptSrc="~site/_layouts/AbrirPagina.js"
        >
      </CustomAction>
     
      <CustomAction
      Id="AbrirPagina"
      RegistrationType="List"
      RegistrationId="10000"
      Description="Abrir página Detalle de cambio de responsable"
      Title="Pág. Detalles"
      Location="EditControlBlock"
        >
        <!--En la UrlAction le paso el ID del elemento actual por QueryString-->
        <!--<UrlAction Url="http://wks649d/sites/TP_SHP_V1/_layouts/TP_SHP_V1/DetalleCambioResponsable.aspx?ItemId={ItemId}"/>-->

        <UrlAction Url="javascript:OpenDialog('{ItemId}');"/>
      </CustomAction>
     
    </Elements>

    Y el .js:

    function OpenDialog(id)
    {
        var pagina = SP.UI.$create_DialogOptions();

        pagina.url = "http://wks649d/sites/TP_SHP_V1/_layouts/TP_SHP_V1/DetalleCambioResponsable.aspx?ID=" + id;

        pagina.width = 800;

        pagina.height = 800;

        SP.UI.ModalDialog.showModalDialog(pagina);

    }

    Lo que hace el CustomAction es abrirme un PopUp de una página .aspx donde se van a mostrar los registros de cambio asociados a ese 'id' que le paso por QueryString!

    Gracias!

    lunes, 19 de noviembre de 2012 15:56
  • No es por el TextBox, es por la forma en la que estas haciendo la iteración. Me explico tu cada vez que iteras almacena el valor en un TextBox pero reemplazas el valor de la otra iteración por eso siempre te muestra la ultima. Yo lo que hago para estos casos es bien me creo en el ASP una etiqueta y a esa etiqueta le asocio el codigo html que quiero mostrar es decir si quiero mostrar una tabla con los registros modificados me creo una table con tres columnas y en cada iteración añado una nueva fila.   Una vez termino de iterar asocio este codigo html a la etiqueta en cuestión. Puedes hacerte una idea mirando mi ultimo post de mi blog en la que uso un grid de Jquery (este ejemplo es algo mas sencillo): http://todosobresharepoint.blogspot.com.es/#!/2012/11/dando-estilos-webpart-sharepoint-usando.html

    lunes, 19 de noviembre de 2012 16:06
  • Muchas gracias Adrián!!
    miércoles, 21 de noviembre de 2012 14:02