Pergunta

meu caso de uso:

Estou tentando implementar um sistema de gerenciamento de eventos no SharePoint usando web part(s) visual(is).

Eu tenho duas listas personalizadas, uma chamada "eventos".Digamos que ele tenha uma coluna "Título" que mostra os detalhes do evento em um Displayform (o campo de título pronto para uso, na verdade) e alguns outros detalhes não relevantes em outras colunas.

A segunda lista é chamada de “Participantes”.Existem duas colunas, primeiro:"Participante" (campo de usuário obtendo o nome de login do usuário atual).Segundo:"Evento" (no momento:String do título do Evento).

Na minha webpart visual (adicionada via &ToolPaneView=2 acima do formulário de exibição da lista "Eventos"), mostro botões ("registrar" e "cancelar registro") dependendo do seguinte 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 neste caso de uso:Se o título do evento ("Título") for alterado posteriormente na lista de eventos, não obtenho um mapeamento correto participante => evento porque no momento verifico apenas a correspondência das sequências de título.

Solução preferida:Faça da coluna "Evento" na lista de participantes uma coluna de pesquisa que obtém o evento real (ID e título, eu acho) e mostra o título na coluna "Evento" da lista de "Participantes", portanto, se o título for alterado mais tarde na lista "Eventos", a lista de participantes atualizará automaticamente as entradas referentes em sua coluna "Evento" e posso mostrar o botão "Registrar"/"Cancelar registro" (além de ter um mapeamento correto, que é necessário com certeza;)).

Seria ótimo se alguém pudesse me dar uma solução/dica de como fazer isso programaticamente, pois não consigo fazer funcionar.

Atenciosamente, Dominik

p.s.Eu sou alemão, então espero que você entenda minha pergunta.Fique à vontade para pedir mais detalhes!Vou tentar o meu melhor para explicar isso em inglês adequado.

editar 1:Aqui está meu método addAttendee até agora:

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) 
        {
            ...
        }
    }
Foi útil?

Solução

Pelo que eu sei, a alteração do tipo de campo de texto para pesquisa não é suportada no Sharepoint.

Você deve criar um novo campo de pesquisa na lista Participantes e apontá-lo para a lista Eventos, nas configurações da lista do Sharepoint ou no código.

Basicamente, o campo de pesquisa tem a mesma estrutura do campo de usuário, que você preencheu na parte final do seu código - ID#;Título.Além disso, o valor do campo de pesquisa é representado pela classe SPFieldLookupValue, portanto pode ser recuperado assim:

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

Você pode definir o valor do campo de pesquisa atribuindo o novo objeto SPFieldLookupValue à propriedade SPListItem:

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

onde 1 - Id do item da lista de eventos e "Grande Evento" - Título do item da lista de eventos.

Se eu também puder adicionar alguns comentários aos seus exemplos de código.Pelo que posso ver, você está pesquisando os participantes do evento, iterando através do objeto SPList.Items e comparando um valor de string do campo "Participante" com um valor de string personalizado.

Essa pesquisa pode retornar resultados errados e lentos, porque geralmente o campo de pesquisa do usuário contém o nome de exibição do usuário, não um nome de login.Eu recomendo usar a consulta CAML:

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;

A consulta acima pesquisa por campo Evento (digite "texto" como no seu exemplo) e por ID de usuário do participante sem nome de login do usuário.Além disso, ele recupera apenas itens que se enquadram na cláusula where da consulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top