Пейджинг не работает с ListView и Webservice с использованием Linq - PullRequest
0 голосов
/ 20 декабря 2010

У меня есть простая страница, которая ищет контакты с помощью веб-сервиса с помощью одного метода, написанного на Linq. На этой странице у меня есть как сетка, так и список с DataPager, чтобы сравнить их. Я могу заставить пейджинг работать отлично с gridview, но код Linq должен возвращать все данные по каждому вызову и позволять веб-странице выбирать только ценность страницы ... не лучшее решение.

Мне сказали, что ListView решит эту проблему, но все примеры, которые мне удалось найти, содержат код Linq на веб-странице, а не на отдельном слое (например, веб-сервис). В идеале я должен быть в состоянии сказать веб-службе возвращать данные определенной страницы (начальный номер записи и количество строк), но как мне заставить ListView (или DataPager) запустить событие, которое запрашивает это? данные

Вот код ASPX:

    <asp:ListView ID="listPersons" runat="server">
    <LayoutTemplate>
        <table>
            <thead>
                <tr>
                    <th>
                        Site ID
                    </th>
                    <th>
                        PersonID
                    </th>
                    <th>
                        Person Name
                    </th>
            </thead>
            <tbody>
                <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            </tbody>
        </table>
        <asp:DataPager ID="Pager1" runat="server" PagedControlID="listPersons" PageSize="5" >
            <Fields>
                <asp:NextPreviousPagerField ShowFirstPageButton="true" ShowPreviousPageButton="true"
                    ShowNextPageButton="false" ShowLastPageButton="false" />
                <asp:NumericPagerField />
                <asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="false"
                    ShowNextPageButton="true" ShowLastPageButton="true" />
            </Fields>
        </asp:DataPager>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <%# Eval("SiteID") %>
            </td>
            <td>
                <%# Eval("PersonID") %>
            </td>
            <td>
                <%# Eval("PersonName") %>
            </td>
        </tr>
    </ItemTemplate>
    <EmptyDataTemplate>
        No data found...
    </EmptyDataTemplate>
</asp:ListView>

Вот код:

private void DoList(string Match)
{
    ContactsService cs = new ContactsService();
    listPersons.DataSource = cs.Find(Match, 100 );
    listPersons.DataBind();
}

и веб-сервис:

[WebMethod]
public List<Person>Find(string Match, int Count)
{
    if (Count < 5) Count = 5;
    using (DataLayer.ContactsDataContext context = new ContactsDataContext())
    {
        var Persons =
            from p in context.Persons
            where p.PersonName.Contains(Match)
            orderby p.LastName, p.FirstName
            select new Person()
            {
                SiteID = p.SiteID,
                PersonID = p.PersonID,
                PersonName = p.PersonName,
            };
        return Persons.Take(Count).ToList();
    }
}

1 Ответ

0 голосов
/ 20 декабря 2010

Не уверен на 100%, ответ здесь. Использование DataPager при привязке DataSource во время выполнения добавит много работы, но я думаю, что это можно сделать.

В качестве альтернативы рассмотрите возможность использования LinqDataSource и подключения события OnSelecting или использования ObjectDataSource. Не уверен, как DataPager работает с ODS (если вообще). LinqDataSource или ObjectDataSource необходимо будет связать с ListView с помощью DataSourceID.

Если вам необходимо выполнить привязку с использованием DataSource, вы можете подключить событие OnPagePropertiesChanging в ListView вместе со свойствами PageSize и StartRowIndex в DataPager. Вам нужно будет найти в вашем дереве управления свой DataPager, поскольку он, вероятно, содержится в шаблоне.

...