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