Pregunta

mi uso-estuche:

Estoy tratando de implementar un sistema de gestión de eventos a SharePoint utilizando la (s) parte (s) de Web Visual.

Tengo dos listas personalizadas, se llama "Eventos". Digamos que tiene un "título" de la columna que muestra los detalles del evento en un formulario de visualización (el campo Título fuera de la casilla que es, en realidad) y algunos otros detalles no relevantes en otras columnas.

La segunda lista se llama "asistentes". Hay dos columnas, primero: "asistente" (campo de usuario obteniendo el nombre de inicio de sesión del usuario actual). Segundo: "Evento" (en este momento: cadena del título del evento).

En My Visual WebPart (agregado a través de Via & ToolPeAview= 2 por encima del formulario de visualización de los "Eventos"-Lista) Muestro los botones ("Registrarse" y "Descriptister") según el siguiente código:

...
using System.Linq;
...
//Snippet of prerequisites for better understanding
SPWeb web = SPContext.Current.Web;
SPUser currentUser = web.CurrentUser;
SPListItem currentEventItem = (SPListItem)SPContext.Current.Item;
string userString = currentUser.ID.ToString() + ";#" + currentUser.LoginName.ToString();
...
//called in page_load
 private void GetButtonView()
    {
        try
        {
            bool foundUsers = (from SPListItem item in tn.Items
                               where item["Attendee"].ToString() == userString
                               && item["Event"].ToString() == currentEventItem.Title
                               select item).Count() > 0;
            if (foundUsers)
            {
                ...
                ButtonRegister.Visible = false;
            }
            else
            {
                ...
                ButtonUnregister.Visible = false;
            }
        }
        catch (Exception ex)
        {
            ...
        }
    }

Problema En este caso de uso: si el título del evento ("Título") se modifica más adelante en la lista de eventos, no obtengo un evento de asistente= >> de asignación correcta porque en este momento verifico solo para coincidir de cadenas de título.

Solución preferida: haga la columna "Evento" en la columna de búsqueda de Atendeks, una columna de búsqueda que obtiene el evento real (ID y el título, creo) y muestra el título en la lista "Asistentes" "Evento" -Column, Entonces, si el título se cambia más adelante en el "Eventos", la lista de asistentes actualizará automáticamente las entradas de referencia en su "evento" -Column y puedo mostrar el "Registro" / "Unregister" -Botton (aparte de tener un mapeo correcto, que es necesario, seguro;).

Sería genial si alguien podría darme una solución / sugerencia de cómo hacerlo programáticamente porque no lo entiendo.

Saludos cordiales, Dominik

P.s. Soy alemán, así que espero que entiendas mi pregunta. ¡Siéntase libre de pedir más detalles! Haré mi mejor esfuerzo para explicarlo en el inglés adecuado.

Editar 1: Aquí está mi método de Addatendee, también, también:

private void AddAttendee() {
        try
        {
            //Using this because read-permissions are used for attendees
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite ElevatedSite = new SPSite(site.ID))
                {
                    using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb(web.ID))
                    {
                        SPList attendeeList= ElevatedWeb.Lists["Attendees"];
                        SPListItemCollection listItems = attendeeList.Items;
                        SPListItem item = listItems.Add();
                        item["Name"] = currentUser.ID.ToString() + ";#" + 
                        currentUser.LoginName.ToString() + ";#";
                        item["Event"] = currentEventItem["Title"];
                        ElevatedWeb.AllowUnsafeUpdates = true;
                        item.Update();
                        ElevatedWeb.AllowUnsafeUpdates = false;
                        ...
                    }
                }
            });
        }
        catch (Exception ex) 
        {
            ...
        }
    }

¿Fue útil?

Solución

As far as I know, changing field type from text to lookup is not supported in Sharepoint.

You should create new lookup field in the Attendees list and point it to Events list, either from Sharepoint list settings, or from code.

Basically, lookup field has the same structure as user field, which you populated in the final bit of your code - ID#;Title. Also, lookup field value is represented by SPFieldLookupValue class, so it can be retrieved like that:

return new SPFieldLookupValue((string)item["EventLookup"]);

You can set lookup field value by assigning new SPFieldLookupValue object to SPListItem property:

item["EventLookup"] = new SPFieldLookupValue(1, "Great Event");

where 1 - Event list item Id and "Great Event" - Event list Item title.

If I also may add some remarks to your code examples. As far as I can see, you are searching attendees for the event by iterating through SPList.Items object and comparing a string value of "Attendee" field with custom string value.

Such a search can return wrong and slow results, because usually user lookup field contains user display name, not a Login Name. I'd recommend using CAML query instead:

SPQuery qry = new SPQuery();
qry.Query =
"  <Where>"
+"    <And>"
+"      <Eq>"
+"          <FieldRef Name='Event' />"
+"          <Value Type='Text'>"+ currentEventItem.Title +"</Value>"
+"      </Eq>"
+"      <Eq>"
+"          <FieldRef Name='Attendee' LookupId='TRUE' />"
+"          <Value Type='Integer'>"+ currentUser.ID.ToString() +"</Value>"
+"      </Eq>"
+"    </And>"
+"  </Where>";
SPListItemCollection listItems = spList.GetItems(qry);
bool foundUsers = listItems.Count > 0;

The query above searches by Event field (type "text" as in your example) and by Attendee user Id without user login Name. Also it retrieves only items, that fall whithin the query where clause.

Licenciado bajo: CC-BY-SA con atribución
scroll top