Trabajar con objetos de listas y colecciones

Última modificación: viernes, 09 de abril de 2010

Hace referencia a: SharePoint Foundation 2010

En este artículo
Objetos
Colecciones
Indizadores

Para realizar acciones sobre datos de listas en un sitio web de SharePoint, primero debe obtener un objeto SPWeb que sirva como punto de entrada al modelo de objetos, con lo que tendrá acceso a listas, elementos, documentos, usuarios, alertas, etc. Para obtener información acerca de la devolución de sitios web de SharePoint, vea Obtención de referencias a sitios, aplicaciones web y otros objetos clave.

Objetos

La mayoría de las clases de los espacios de nombres Microsoft.SharePoint y Microsoft.SharePoint.Administration empiezan por SP. Por lo general, las clases del ensamblado Microsoft.SharePoint que no comienzan con este prefijo representan controles de formulario web.

SharePoint Foundation normalmente no guarda las modificaciones de las propiedades de objeto en la base de datos hasta que se llama al método Update en el objeto especificado. En el siguiente ejemplo se muestra cómo cambiar el título y la descripción de la lista Tasks.

         
Dim oList As SPList = oWebsite.Lists("Tasks")
oList.Title = "New_Title"
oList.Description = "List_Description"
oList.Update()
SPList oList = oWebsite.Lists["Tasks"];
oList.Title="New_Title";
oList.Description="List_Description";
oList.Update();

Nota

Los metadatos para el documento no pueden modificarse mediante el método Update() del objeto SPListItem si el documento está desprotegido desde una biblioteca de documentos.

Colecciones

Al igual que las listas son en el centro de un sitio de SharePoint, las colecciones lo son en el centro de sus modelos de objeto. Puede usar cada colección para agregar, eliminar, enumerar y actualizar un tipo de objeto. Las clases de colecciones normalmente comparten las siguientes características:

  • Tienen un nombre que termina en "Collection".

  • Implementan la interfaz System.Collections.ICollection.

  • Tienen una propiedad Count de tipo Int32.

  • Tienen un indizador Int32 que puede usarse para obtener el elemento nth de la colección.

  • Tienen un indizador que toma un identificador de elemento.

  • Tienen métodos Add y Delete.

Al llamar al método Add para una colección, normalmente se actualiza la base de datos en el servidor back-end con los datos adecuados, excepto cuando se necesita información adicional para actualizar los datos. En este caso, el uso del método Add devuelve un objeto que se puede usar para recopilar la información. Por ejemplo, para agregar un elemento a una lista, en primer lugar use el método Add de la clase Microsoft.SharePoint.SPListItemCollection para devolver un objeto SPListItem, asigne valores a las propiedades adecuadas del objeto y, a continuación, llame al método Update para que los cambios surtan efecto en la base de datos de contenido.

Indizadores

Los indizadores proporcionan un medio útil para obtener acceso a elementos individuales de las colecciones. Para devolver un elemento, use corchetes ([]) en Microsoft C# o paréntesis (()) en Microsoft Visual Basic que incluyan un índice o cadena que identifique el elemento de la colección.

Por ejemplo, si oWebsite representa una instancia de la clase SPWeb, SPList oList = oWebsite.Lists["Announcements"] devuelve la lista Announcements en C#, mientras que Dim oList As SPList = oWebsite.Lists("Announcements") devuelve la misma lista en Visual Basic.

Para devolver elementos de la lista, un procedimiento recomendado consiste en llamar a unos de los métodos GetItem* del objeto de lista y especificar los elementos que se recuperarán. El uso de la propiedad Items para obtener todos los elementos de una lista puede reducir el rendimiento, ya que fuerza la devolución de todas las columnas de todos los elementos. En su lugar, use el método GetItems, por ejemplo, y pase un objeto SPQuery para especificar el subconjunto: SPListItemCollection collItem = oList.GetItems(oQuery) (en Visual Basic, Dim collItem As SPListItemCollection = oList.GetItems(oQuery)).

Una vez devuelta una colección de elementos desde una lista mediante un método GetItem*, puede especificar un nombre de campo como un indizador y procesar una iteración en la colección para devolver los valores del campo. En el siguiente ejemplo se muestran los valores Due Date, Status y Title para cada elemento de una colección.

Dim oItem As SPListItem

For Each oItem In  collItem

    Response.Write(SPEncode.HtmlEncode(oItem("Due Date").ToString()) + "<BR>")
    Response.Write(SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")
    Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + "<BR>")

Next oItem
foreach(SPListItem oItem in collItem)
{
    Response.Write(SPEncode.HtmlEncode(oItem["Due Date"].ToString()) + "<BR>");
    Response.Write(SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
    Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + "<BR>");
}

Nota

Además de requerir una directiva using (Imports en Visual Basic) para el espacio de nombres Microsoft.SharePoint, el ejemplo anterior requiere una directiva para el espacio de nombres Microsoft.SharePoint.Utilities.

En el siguiente ejemplo se muestra cómo devolver todos los valores Título y Estado para la lista de tareas en un sitio web de SharePoint.

Dim oWebsite As SPWeb = SPContext.Current.Web
Dim oList As SPList = oWebsite.Lists("Tasks")
Dim collItem As SPListItemCollection = oList.GetItems("Title", "Status")

Dim oItem As SPListItem
For Each oItem In  collItem

    Response.Write(SPEncode.HtmlEncode(oItem("Title").ToString()) + " :: " _
        & SPEncode.HtmlEncode(oItem("Status").ToString()) + "<BR>")

Next oItem
SPWeb oWebsite = SPContext.Current.Web;

SPList oList = oWebsite.Lists["Tasks"];
SPListItemCollection collItem = oList.GetItems("Title", "Status");

foreach(SPListItem oItem in collItem)
{
    Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + " :: " + 
        SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");
}

Si se ha implementado la limitación de peticiones, es posible que las consultas ineficientes se bloqueen debido a excesivos problemas de recuento de búsquedas o recuento de elementos. Puede mejorar la eficiencia de una consulta y reducir los problemas de recuento de búsquedas mediante la definición de un objeto SPQuery que especifique un conjunto restringido de campos de vista (ViewFields) y, a continuación, pasar dicho objeto de consulta al método GetItems, como se muestra en el ejemplo siguiente.

Dim oQuery As New SPQuery()
oQuery.Query = "<ViewFields><FieldRef Name = ""Title"" />" & 
    "<FieldRef Name = ""Status""/></ViewFields>"
Dim collItem As SPListItemCollection = oList.GetItems(oQuery)
SPQuery oQuery = new SPQuery();
oQuery.Query  =  "<ViewFields><FieldRef Name = \"Title\" />" +
    "<FieldRef Name = \"Status\"/></ViewFields>";
SPListItemCollection collItem = oList.GetItems(oQuery);

Para solucionar los problemas de limitación de peticiones de recuento de elementos, es posible que sea necesario paginar los resultados en el índice de elemento mediante la clase SPListItemCollectionPosition.

Nota

Además de requerir una directiva using (Imports en Visual Basic) para el Microsoft.SharePoint espacio de nombres, en el ejemplo anterior se requiere una directiva para el espacio de nombres Microsoft.SharePoint.Utilities.

También puede usar los indizadores para modificar los valores de una lista. En el ejemplo siguiente, se agrega un nuevo elemento de lista a una colección y los valores de una columna de dirección URL se asignan al elemento.

Dim oNewItem As SPListItem = oList.Items.Add()

oNewItem("URL_Field_Name") = "URL, _ Field_Description"

oNewItem.Update() 
SPListItem oNewItem = oList.Items.Add();

oNewItem["URL_Field_Name"] = "URL, Field_Description";

oNewItem.Update();

Nota

El tipo de campo URL es único porque implica dos valores (separados por una coma y un espacio) y en el ejemplo anterior, estos valores se asignan al nuevo elemento mediante un indizador único.

En el siguiente ejemplo se usa el método GetItemById(Int32) para devolver un elemento y, a continuación, se establecen sus valores de columna Status y Title.

Dim oItem As SPListItem = oList.GetItemById(1) 

oItem("Status") = "Task_Status"
oItem("Title") = "Task_Title"

oItem.Update() 
SPListItem oItem = oList.GetItemById(1);

oItem["Status"]="Task_Status";
oItem["Title"]="Task_Title";

oItem.Update();

Si puede especificar que la lista de campos recupere para el elemento y si ninguno de los campos es de tipo Lookup o un tipo de campo que herede de SPFieldLookup, puede mejorar el rendimiento mediante una llamada al método GetItemByIdSelectedFields(Int32, []), en lugar de llamar a GetItemById(Int32).

Nota

Un indizador produce una excepción ArgumentOutOfRange si no encuentra el elemento especificado.

Para obtener más información acerca de los formatos de datos específicos que se usan para los elementos de lista en SharePoint Foundation, consulte la clase SPListItem.

Vea también

Referencia

Microsoft.SharePoint

Microsoft.SharePoint.Administration

Conceptos

Procedimiento para devolver elementos de una lista

Procedimiento para crear o eliminar listas

Procedimiento para agregar o eliminar elementos de lista

Procedimiento para leer el valor de un campo en un elemento de lista

Espacios de nombres en el modelo de objetos de SharePoint Foundation

Uso de Visual Studio para el desarrollo de SharePoint

Obtención de referencias a sitios, aplicaciones web y otros objetos clave

Registro e importación de espacios de nombres