Pergunta

Estou consultando um SPList no sharepoint 2010 e preencher o correspondente modo de exibição de grade:

<asp:DataGrid runat="server" ID="gridView" AutoGenerateColumns="false" AlternatingRowStyle-BackColor="ActiveBorder" Width="95%" GridLines="Vertical" AllowPaging="true" PageSize="30" CssClass="mGrid" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" >
    <Columns>
<asp:BoundColumn DataField="ID"></asp:BoundColumn>
<asp:BoundColumn DataField="Title"></asp:BoundColumn>
<asp:HyperLinkColumn DataTextField="Name" ></asp:HyperLinkColumn>
<asp:BoundColumn DataField="Surname"></asp:BoundColumn>
<asp:BoundColumn DataField="email"></asp:BoundColumn>
</columns>
</gridview>

Se eu uso esta linha de código que implicaria que, ao usar este, juntamente com um modo de exibição de grade ele me permita visualizar todos os itens encontrados no SPlist .Mas eu preciso ser capaz de mostrar apenas os dados específicos da Lista, por esta razão, eu estou usando um SPQuery para filtrar a lista com o seguinte código :

            Guid webId = web.ID;
            SPListItemCollection items = list.Items;

            SPList currentTestList = web.Lists[listGuid];

            // query 
            SPQuery oQuery = new SPQuery();
            oQuery.ExpandRecurrence = true;

            oQuery.Query = @"
                <Where>
                    <Eq>
                        <FieldRef Name='Name' />
                        <Value Type='Text'>Adrian</Value>
                    </Eq>
                </Where>
                ";
            gridView.DataSource = list.GetItems(oQuery);
            gridView.DataBind();

no entanto, aquando da execução levanta o seguinte problema, "Um campo ou propriedade com o nome de 'Sobrenome' não foi encontrado na fonte de dados selecionada".Alguém pode realçar o que há de errado com o meu código?ou eu estou faltando alguma coisa?desde quando eu uso o "getDataTable()" ele funciona muito bem, mas, por outro lado, após a filtragem da lista listados erro é gerado.

ATUALIZAÇÃO


Atualizados os campos de visão como indicado ainda o mesmo erro ainda persiste Código Atual:

SPQuery oQuery = new SPQuery();
                oQuery.ExpandRecurrence = true;

                oQuery.Query = @"
                    <Where>
                        <Eq>
                            <FieldRef Name='Name' />
                            <Value Type='Text'>Adrian</Value>
                        </Eq>
                    </Where>
                    ";

                oQuery.ViewFields = @"<FieldRef Name='Name' /><FieldRef Name='Surname' /><FieldRef Name='email' /><FieldRef Name='ID' /><FieldRef Name='Title' />";
                oQuery.ViewFieldsOnly = true;
                //binding it to grid view

                SPListItemCollection filteredList = list.GetItems(oQuery);
                gridView.DataSource = filteredList;
                //gridView.DataSource = list.GetItems(oQuery);
                gridView.DataBind();
Foi útil?

Solução

Tente usar SPListItemCollection.GetDataTable como esta:

var dt = list.GetItems(oQuery).GetDataTable();
gridView.DataSource = dt;

Quando você acabou de usar list.GetItems(oQuery) como a fonte de dados que o GridView é um SPListItemCollection que ele não entende, mas é um IEnumerable que ele entende.Então, agora o GridView pode-se enumerar a fonte de dados e obter seus itens de volta, estas são do tipo SPListItem.O GridView, em seguida, tenta obter cada valor da coluna como um campo ou propriedade do item processos de ti.É OK para IDENTIFICAÇÃO, Título e Nome como todos estes existe como propriedades no SPListItem, mas não há nenhuma propriedade SPListItem.Apelido que você tem que usar SPListItem["Sobrenome"] mas o GridView não sabe o que.

Quando você usa list.GetItems(oQuery).GetDataTable() como a fonte de dados que o GridView é um DataTable e o GridView sabe como acessar as Linhas e Colunas do que isso.

Outras dicas

Você está certo de que 'Sobrenome' é o bom nome interno do campo?O nome interno é o que precisa para ser usado durante as consultas.

Para descobrir rapidamente, você pode facilmente verificar a lista de usar o powershell:

$url = "http://www.yoursharepointsite.com/mysite"
$listname = "YourListName"

$site= SPSite ($url) 
$web=$site.OpenWeb() 
$list=$web.Lists[$listname] 
$list.Fields |select ID, title, internalname
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top