2010-12-20 6 views
0

Ich habe eine einfache Seite, die Kontakte nachschlägt, die einen Webservice mit einer einzigen Methode verwenden, die in Linq geschrieben wird. Auf der Seite habe ich sowohl eine Gridview als auch eine Listview mit einem DataPager, um die beiden zu vergleichen. Ich kann Paging gut mit der Gridview arbeiten, aber der Linq-Code muss alle Daten bei jedem Aufruf zurückgeben und lassen Sie die Web-Seite nur eine Seite Wert auswählen ... nicht die beste Lösung.Paging funktioniert nicht mit ListView und Webservice mit Linq

Mir wurde gesagt, dass ein ListView dieses Problem lösen wird, aber alle Beispiele, die ich finden konnte, haben den Linq-Code auf der Webseite statt in einer separaten Schicht (z.B. einem Webservice). Im Idealfall sollte ich dem Webdienst mitteilen können, dass er eine bestimmte Seite mit Daten zurückbringt (Startnummer und Anzahl der Zeilen), aber wie bekomme ich den ListView (oder den DataPager), um ein Event auszulösen, das danach fragt Daten?

Hier ist der ASPX Code:

<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> 

Hier ist der Code hinter:

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

und die Bahn serivice:

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

Antwort

0

nicht 100% sicher eine hier Antwort. Die Verwendung des DataPagers während des Bindens der DataSource zur Laufzeit wird viel Arbeit bringen, aber ich denke, dass es getan werden kann.

Alternativ können Sie auch eine LinqDataSource verwenden und das OnSelecting-Ereignis verkabeln oder eine ObjectDataSource verwenden. Nicht sicher, wie der DataPager mit einem ODS funktioniert (wenn überhaupt). Die LinqDataSource oder die ObjectDataSource muss der ListView mithilfe der DataSourceID zugeordnet werden.

Wenn Sie mithilfe der DataSource binden müssen, können Sie das OnPagePropertiesChanging-Ereignis in der ListView zusammen mit den PageSize- und StartRowIndex-Eigenschaften im DataPager verbinden. Sie müssen Ihren Kontrollbaum für Ihren DataPager durchsuchen, da er wahrscheinlich in einer Vorlage enthalten ist.

+0

Das Problem bei der Verwendung von ODS und LDS auf der Webseite besteht darin, dass es das architektonische Ziel einer mehrstufigen Architektur verletzt. Ich möchte eine Business-Schicht in LINQ, die von jedem Front-End aufgerufen werden kann. Der Web-Service ist ein Beispiel für eine Business-Schicht. Ich könnte ebenso einfach eine Business-Schicht in einer DLL erstellen, die von der Benutzerschicht aufgerufen wurde. Beide Lösungen haben das Problem, das ich hier anwende. –