O cenário é o seguinte, temos uma lista que funciona como um glossário, onde os principais termos e siglas de uma organização são armazenados. Essa lista de nome "Glossário" possui dois campos, "Título" e "Descrição". A idéia é criar um método de busca nessa lista para que passado um termo específico, sejam carregados todos os itens relacionados da lista em uma grid.
Segue o código:
private void makeSearch(String term) { using (SPSite site = new SPSite("http://meuSite:1234/")) { SPWeb web = site.OpenWeb(); SPList listCol = web.Lists["Glossário"]; SPQuery query = new SPQuery(); query.Query = "<OrderBy><FieldRef Name='Title' /></OrderBy>" + "<Where><Contains><FieldRef Name='Title' />" + "<Value Type=\"Text\">" + term + "</Value></Contains></Where>";
SPListItemCollection itemsCol = listCol.GetItems(query);
DataTable t = this.MakeTable(new String[] { "Título", "Descrição" },
new Type[] { typeof(string), typeof(string) }); foreach (SPListItem item in itemsCol) { string titulo = item["Título"].ToString(); string descrição = item["Descrição"].ToString(); t.Rows.Add(new object[] { titulo, descrição }); } gvSearch.DataSource = t; gvSearch.DataBind(); }
}
private DataTable makeTable(String[] titles, Type[] types)
{ DataTable table = new DataTable(); DataColumn[] dataColumns = new DataColumn[titles.Length]; for (int i = 0; i < titles.Length; i++) { dataColumns[i] = new DataColumn(titles[i], types[i]); } table.Columns.AddRange(dataColumns); return table; }
Aqui é instacianda a referência para o portal no qual está nossa lista
using (SPSite site = new SPSite("http://meuSite:1234/"))
Instanciamos o site que possui a lista
SPWeb web = site.OpenWeb();
Uma maneira bastante prática de se obter uma referência para uma lista é passando seu nome como index na coleção de listas do site
SPList listCol = web.Lists["Glossário"];
Este é o ponto chave do exemplo,
Primeiro instaciamos um objeto do tipo SPQuery no qual possui as propriedades necessárias para execução do nosso filtro.
Na propriedade Query nós setamos o filtro, que é construído de acordo com uma CAML(Collaborative Application Markup Language) que possui uma sintaxe própria que pode ser melhor estudada no site do msdn. No nosso filtro nós estamos ordenando a listagem pelo título (tag <OrderBy>) e filtrando (tag <Where>) por todos itens que contiverem o termo passado (tag <Contains>).
Após definido nosso objeto de consulta “query”, ele é utilizado pelo metodo GetItems() e o rertorno é dado de acordo com o seu filtro.
SPQuery query = new SPQuery(); query.Query = "<OrderBy><FieldRef Name='Título' /></OrderBy>" + "<Where><Contains><FieldRef Name='Título' />" + "<Value Type=\"Text\">" + term + "</Value></Contains></Where>";
SPListItemCollection itemsCol = listCol.GetItems(query);
Bem, executada a consulta, o que nos resta é preencher a grid com os valores.Criei um método para criar uma tabela (makeTable()) e após adicionar as linhas com os itens da lista, carrego a tabela na grid.Percebam que da mesma forma que selecionamos a lista indexando-a pelo nome na coleção de listas do site,nós também o fazemos com o item de uma lista para obter um campo específico, no nosso caso o Título e a Descrição.Após a montagem da tabela, ela é setada no grid e nossa tarefa está completa.
DataTable t = this.MakeTable(new String[] { "Título", "Descrição" },
new Type[] { typeof(string), typeof(string) }); foreach (SPListItem item in itemsCol) { string titulo = item["Título"].ToString(); string descrição = item["Descrição"].ToString(); t.Rows.Add(new object[] { titulo, descrição }); } gvSearch.DataSource = t; gvSearch.DataBind();
A utilização da classe SPQuery é bastante útil para manipulação de itens de uma lista, mas não se limita apenas a uma, podendo executar consultas a items de mais de uma lista.
Bem, esse foi o primeiro post do nosso tour pelo SharePoint, ainda temos muitos temas para abordar e em breve estarei postando por aqui. Bons estudos a todos, um forte abraço!