Pregunta

Quiero usar el control MultipleLookupField en una página web que se ejecutará en el contexto de SharePoint.Me preguntaba si alguien podría ayudarme con un ejemplo que muestre paso a paso cómo usar el control dos para mostrar dos colecciones SPField.

¿Fue útil?

Solución

No estoy del todo seguro de entender su pregunta, especialmente lo relacionado con mostrar dos colecciones SPField.¡Lo siento si esta resulta ser la respuesta a una pregunta completamente diferente!

De todos modos, aquí hay una demostración rápida del uso de MultipleLookupField en un elemento web.

Cree un sitio de equipo.Agregue algunas tareas a la lista de tareas.También coloque un documento en la biblioteca de Documentos compartidos.Cree una nueva columna en la biblioteca de Documentos compartidos;llámelo "Relacionado", haga que sea una búsqueda en el campo Título de la lista de Tareas y permita múltiples valores.

Ahora cree un elemento web, haga todo el texto estándar habitual y luego agregue esto:

Label l;
MultipleLookupField mlf;

protected override void CreateChildControls()
{
    base.CreateChildControls();
    SPList list = SPContext.Current.Web.Lists["Shared Documents"];
    if (list != null && list.Items.Count > 0)
    {
        LiteralControl lit = new LiteralControl("Associate tasks to " + 
                             list.Items[0].Name);
        this.Controls.Add(lit);

        mlf = new MultipleLookupField();
        mlf.ControlMode = SPControlMode.Edit;
        mlf.FieldName = "Related";
        mlf.ItemId = list.Items[0].ID;
        mlf.ListId = list.ID;
        mlf.ID = "Related";
        this.Controls.Add(mlf);

        Button b = new Button();
        b.Text = "Change";
        b.Click += new EventHandler(bClick);
        this.Controls.Add(b);

        l = new Label();
        this.Controls.Add(l);
    }

}

void bClick(object sender, EventArgs e)
{
    l.Text = "";
    foreach (SPFieldLookupValue val in (SPFieldLookupValueCollection)mlf.Value)
    {
        l.Text += val.LookupValue.ToString() + " ";
    }
    SPListItem listitem = mlf.List.Items[0];
    listitem["Related"] = mlf.Value;
    listitem.Update();
    mlf.Value = listitem["Related"];
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    EnsureChildControls();
}

Por supuesto, esto es casi ridículo: todo está codificado, no hay ningún manejo de errores y no tiene ningún propósito útil, pero solo pretende ser una demostración rápida.Ahora cree e implemente este elemento web y agregue una instancia del mismo a la página de inicio de su sitio de grupo;debería permitirle obtener y configurar las tareas asociadas con el primer documento de la biblioteca.

La parte extraña hacia el final del controlador de clic del botón, donde leemos un valor de mlf.Value y luego lo volvemos a escribir, parece ser necesaria si desea que la interfaz de usuario permanezca sincronizada con los valores reales de la lista.Intente omitir la última línea de bClick para ver a qué me refiero.Esto me ha estado volviendo loco durante la última hora, y espero que a otro comentarista se le ocurra un mejor enfoque...

Otros consejos

Mmm.Funciona bien en el mío, así que veamos si podemos descubrir en qué se diferencia su configuración...

Parece que está teniendo problemas para completar el control;Mi primera suposición sería que esto se debe a que el código hace muchas suposiciones sobre las listas con las que está hablando.¿Puedes comprobar que tienes un sitio de equipo sencillo con (supongamos que estos nombres distinguen entre mayúsculas y minúsculas):

  1. Una lista llamada Tareas, con varios elementos.
  2. Una biblioteca llamada Documentos compartidos con al menos un documento.
  3. Una columna llamada Relacionados en la biblioteca de Documentos compartidos
  4. La columna Relacionada es un campo de búsqueda en la columna Título de Tareas y permite múltiples valores.
  5. El primer documento en Documentos compartidos tiene un valor para Relacionados

Luego agregue el elemento web.Dedos cruzados...

Mmm.Vale, todavía estoy intentando romper el mío...así que fui al directorio de diseños y creé un archivo foo.aspx.Aquí lo tienes:

<%@ Page Language="C#" Inherits="System.Web.UI.Page" MasterPageFile="~/_layouts/simple.master" %> 
<%@ Register Tagprefix="foo" Namespace="Foople" Assembly="Foople, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"%>
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
<foo:WebPart1 id="fred" runat="server" />
<foo:WebPart1a id="barney" runat="server" />
</asp:Content>

WebPart1 es el elemento web de antes.WebPart1a es exactamente el mismo código, pero en una clase que hereda directamente de WebControl en lugar de WebPart.

Funciona bien, aparte de un problema de validación de seguridad en la devolución de datos que no puedo molestarme en depurar.

Al cambiar la página maestra a ~masterurl/default.master, cargué foo.aspx en la biblioteca de Documentos compartidos y también funciona bien desde allí: tanto WebControl como WebPart se comportan correctamente y el problema de seguridad también desapareció.

Entonces estoy perdido.Aunque noté esta página con un oscuro posible error que también se encuentra en SPFolder.get_ContentTypeOrder(): http://forums.msdn.microsoft.com/en-US/sharepointdevelopment/thread/63baf273-7f36-453e-8293-26417759e2e1/

¿Alguna posibilidad de que puedas publicar tu código?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top