0

Linq で記述された単一のメソッドで Web サービスを使用して連絡先を検索する単純なページがあります。ページには、グリッドビューとリストビューの両方があり、DataPager を使用して 2 つを比較します。グリッドビューでページングを正常に機能させることができますが、Linq コードは各呼び出しですべてのデータを返さなければならず、Web ページにページの価値のみを選択させる必要があります... 最適なソリューションではありません。

ListView がこの問題を解決すると言われましたが、私が見つけたすべての例では、別のレイヤー (Web サービスなど) ではなく Web ページに Linq コードがあります。理想的には、Web サービスに特定のページに相当するデータ (開始レコード番号と行数) を戻すように指示できるはずですが、これを要求するイベントを 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();
}

および Web サービス:

[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();
    }
}
4

1 に答える 1

0

ここでの答えは 100% 確実ではありません。実行時に DataSource をバインドしながら DataPager を使用すると、多くの作業が追加されますが、実行できると思います。

または、LinqDataSource を使用して OnSelecting イベントを接続するか、ObjectDataSource を使用することを検討してください。DataPager が ODS でどのように機能するかわかりません (もしあったとしても)。LinqDataSource または ObjectDataSource は、DataSourceID を使用して ListView に関連付ける必要があります。

DataSource を使用してバインドする必要がある場合は、DataPager の PageSize および StartRowIndex プロパティと共に、ListView の OnPagePropertiesChanging イベントを関連付けることができます。テンプレートに含まれている可能性が高いため、DataPager のコントロール ツリーを検索する必要があります。

于 2010-12-20T04:19:00.523 に答える